Python - AttributeError:'NoneType'对象没有属性'findAll'

时间:2013-08-05 19:05:31

标签: python attributes findall nonetype

我写了第一篇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'

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

脚本读取的页面中没有table id datatable_main

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