2013-08-05 115 views
1

我已经写了我的第一个python代码来抓取一个网站。Python - AttributeError:'NoneType'对象没有属性'findAll'

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) 

当我在我的IDE,称为pyCharm它的作品好,但是当我尝试一下它运行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' 

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

+0

@karthikr:这不是问题所在;他正在尝试调用'table.findAll',因为_table_已经是'None'。 – abarnert

+0

为了调试这个,尝试打印'soup',和'soup.find('table')',和'soup.find('table',id =“datatable_main”)',看看它们是什么样子。 – abarnert

+0

此外,我注意到您的回溯中的行和源中的行不匹配。您是否有可能将较旧(并且尚未运行)的脚本版本上传到服务器箱? – abarnert

回答

2

你是忽略所有错误可能发生在urllib2.urlopen,如果由于某种原因,你得到一个错误试图让你的服务器,你就不会在本地测试您实际上传递一个空字符串,在该页面( '')或您不希望的页面(例如404页面)更改为BeautifulSoup

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

你应该确保你可以得到你想要在你的服务器上获得的页面,或正确处理异常。

+0

也可能'find'返回'None',因为它传递了一个404错误页面,或者一些完全有效的页面不会发生有一个ID为'datatable_main'的表,或者其他各种可能性。 – abarnert

+0

@abarnert事实上,这很可能是发生了什么事情,因为在重新阅读urllib2文档后,它似乎总是**如果它有一个实际的错误(在一段时间内没有使用过urllib2)会引发'URLError'。编辑它。 – Wessie

+0

谢谢大家的回答,我已阅读本网站多年,这是我的第一个问题。本地的脚本工作很好,我只做了一个小测试,并能在终端上打印kitco网址。我相信我错过了某种模块,“findAll”没有被识别。我明显是一名非常业余的程序员,非常感谢您的帮助。 –

1

没有tableiddatatable_main在脚本读取的页面中。

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

+0

谢谢 - 我做了这个 >>> from BeautifulSoup import BeautifulSoup >>> soup = BeautifulSoup(urllib2.urlopen('http://www.kitco.com/kitco-gold-index.html').read( )) >>> print soup and the page was returned in the terminal –

相关问题