【发布时间】: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。 -
要调试此问题,请尝试打印出
soup、soup.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