【问题标题】:TypeError: Cannot read object of type 'list'TypeError:无法读取“列表”类型的对象
【发布时间】:2018-10-03 11:34:38
【问题描述】:

据我所知,我还没有创建一个列表,但它给了我一个

TypeError:无法读取“列表”类型的对象。

有什么想法吗?

Python 新手,所以放轻松。

我们不胜感激。

示例网址:

https://nclbgc.org/search/licenseDetails?licenseNumber=80479

这是完整的回溯:

Traceback (most recent call last):
  File "ncscribble.py", line 26, in <module>
    df = pd.read_html(url)[0].dropna(how='all')
  File "C:\Users\rkrouse\Desktop\Python\lib\site-packages\pandas\io\html.py", line 987, in read_html
    displayed_only=displayed_only)
  File "C:\Users\rkrouse\Desktop\Python\lib\site-packages\pandas\io\html.py", line 815, in _parse
    raise_with_traceback(retained)
  File "C:\Users\rkrouse\Desktop\Python\lib\site-packages\pandas\compat\__init__.py", line 404, in raise_with_traceback
    raise exc.with_traceback(traceback)
TypeError: Cannot read object of type 'list'

完整代码:

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen
import time
import csv
import pandas as pd
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def license_exists(soup):
    with open('NC_urls.csv','r') as csvf:
        urls = csv.reader(csvf)
        for url in urls:
            if soup(class_='btn btn-primary"'):
                return False
            else:
                return True


with open('NC_urls.csv','r') as csvf: # Open file in read mode
    urls = csv.reader(csvf)
    for url in urls:
        df = pd.read_html(url)[0].dropna(how='all')
        df = df.groupby(0)[1].apply(lambda x: ' '.join(x.dropna())).to_frame().rename_axis(None).T
        if not license_exists(soup(page, 'html.parser')):
            # if the license is present we don't want to parse any more urls.

            break


df.to_csv('NC_Licenses_Daily.csv', index=False)

【问题讨论】:

  • 不应该是df = pd.read_html(url[0]).dropna(how='all')吗?无论如何,在for url in urls: 中添加print(url) 作为第一条语句并检查输出。
  • 试过了,它给了我一个 AttributeError:'list' 对象没有属性 'dropna'。所以,它仍然是指回一个列表。
  • 那就是df = pd.read_html(url[0])[0].dropna(how='all')

标签: python pandas beautifulsoup traceback


【解决方案1】:

当你遇到类型错误时,打印值通常是个好主意,像这样:

    for url in urls:
        print(repr(url))
        df = pd.read_html(url)[0].dropna(how='all')

它会给你:

['https://nclbgc.org/search/licenseDetails?licenseNumber=80479']

这是因为 CSV row 本身就是一个列表。您需要获取第一个列表元素并将其传递给 HTML 处理器:

    for url in urls:
        df = pd.read_html(url[0])[0].dropna(how='all')

要获取页面数据,您可以使用requests:

import requests
page = requests.get(url[0]).content

【讨论】:

  • 知道了。所以,现在它告诉我页面没有定义,我明白为什么,我只是不确定如何更正它。
  • 你对page有什么期望?
  • 这是我在其他项目中使用的脚本的一部分。以某种方式结束了这个。
  • 对不起,我还需要正确的 html.parser 吗?还是我可以直接报废?
  • 我认为在这种情况下,您不应该将pd.read_html 与 URL 一起使用,而是单独下载 URL 并将其结果提供给 pandas 和 BeatifulSoup。
猜你喜欢
  • 2016-11-28
  • 2015-04-22
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2019-06-25
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多