2013-08-05 127 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 –

相關問題