【问题标题】:Python - AttributeError: 'NoneType' object has no attribute 'findAll'Python - AttributeError:“NoneType”对象没有属性“findAll”
【发布时间】:2013-08-06 14:37:05
【问题描述】:

我已经编写了我的第一个 python 代码来抓取网站。

import csv
import urllib2
from BeautifulSoup import BeautifulSoup

c = csv.writer(open("data.csv", "wb"))
soup = BeautifulSoup(urllib2.urlopen('http://www.kitco.com/kitco-gold-index.html').read())
table = soup.find('table', id="datatable_main")
rows = table.findAll('tr')[1:]

for tr in rows:
   cols = tr.findAll('td')
   text = []
   for td in cols:
       text.append(td.find(text=True))
   c.writerow(text)

当我在名为 pyCharm 的 ide 中本地测试它时,它运行良好,但是当我在运行 CentOS 的服务器上尝试它时,我收到以下错误:

domainname.com [~/public_html/livegold]# python scraper.py
Traceback (most recent call last):
  File "scraper.py", line 8, in <module>
    rows = table.findAll('tr')[:]
AttributeError: 'NoneType' object has no attribute 'findAll'

我猜我没有远程安装模块,我已经挂断了两天,任何帮助将不胜感激! :)

【问题讨论】:

  • @karthikr:问题不在于 tr;他在尝试调用 table.findAll 时遇到异常,因为 table 已经是 None
  • 要调试此问题,请尝试打印出soupsoup.find('table')soup.find('table', id="datatable_main"),看看它们都长什么样。
  • 另外,我注意到回溯中的行和源中的行不匹配。您是否有可能将脚本的较旧(尚未工作)版本上传到服务器盒?
  • Abarnert,非常感谢您的帮助。多亏了您的故障排除建议,我才能将问题定位到soup.find('table',id="datatable_main") - 当我打印出来时,出现了“None”这个词。
  • 所以现在你必须弄清楚为什么它是None。查看soup,看看是否有一个table,其id 是datatable_main。如果不是,显然任何对find 的尝试都应该并且将会返回None——要么你正在读取错误的数据,要么你的数据结构错误。另一方面,如果您确实看到它,那么您必须弄清楚为什么find 没有找到它。无论哪种方式,找出它是调试的第一步。

标签: python attributes findall nonetype


【解决方案1】:

您忽略了urllib2.urlopen 中可能发生的任何错误,如果由于某种原因您在尝试在服务器上获取该页面时遇到错误,而您没有在本地进行测试,您实际上是在传递一个空字符串('') 或您不期望的页面(例如 404 页面)到BeautifulSoup

这反过来又使您的soup.find('table', id="datatable_main") 返回None,因为该文档是您不期望的。

您应该确保可以在您的服务器上获取您尝试获取的页面,或者正确处理异常。

【讨论】:

  • find 也有可能返回 None,因为它传递了一个 404 错误页面,或者一些完全有效的页面没有碰巧有一个 id 为 datatable_main 的表,或者所有各种其他可能性。
  • @abarnert 确实,这很可能是正在发生的事情,因为在重新阅读 urllib2 文档之后,它似乎 always 如果它有实际错误(有一段时间没有使用 urllib2 了)。编辑它。
  • 谢谢大家的回答,我已经阅读这个网站多年了,这是我的第一个问题。在本地脚本运行良好,我只是做了一个小测试,并且能够在我的终端中打印 kitco url。我相信我缺少某种模块并且“findAll”没有被识别。我显然是一个非常业余的程序员,感谢您的所有帮助。
  • 另外,页面上确实有一个id为datatable_main的表,因此脚本在本地工作。
  • @SeymourDucats 尝试查看urllib2.urlopen 在您的服务器上返回的内容。
【解决方案2】:

脚本读取的页面中没有tableid datatable_main

尝试将返回的页面打印到终端 - 也许您的脚本无法联系 Web 服务器?有时托管服务会阻止传出 HTTP 连接。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2017-10-05
  • 2018-03-17
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多