2012-12-10 40 views
1

我在與測試此BeautifulSoup履帶式的問題。如果有一些明顯的錯誤,請原諒我,因爲這是我進入Python的第三個小時。我有下面這段代碼...回到KeyError異常主叫功能

def huffpost_crawl(): 
article_list = [] 
DOMAIN = 'huffingtonpost.com' 
huff_soup = BeautifulSoup(urllib2.urlopen("http://www.huffingtonpost.com").read()) 
news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})[0] 
for news in news_list[0]: 
    title = news('div', {'class', 'snp_most_popular_entry_desc'})[0].a.get_text() 
    full_url = news('div', {'class', 'snp_most_popular_entry_image'}).a["href"] 
    blurb = "" 
    thumb_url = news('div', {'class', 
    'snp_most_popular_entry_image'}).a.img["longdesc"] 


print title 

huffpost_crawl() 

當我運行在我的終端pythong test.py,我與...

Traceback (most recent call last): 
    File "test.py", line 21, in <module> 
    huffpost_crawl() 
File "test.py", line 11, in huffpost_crawl 
    for news in news_list[0]: 
File "/usr/local/lib/python2.7/site-packages/bs4/element.py", line 879, in __getitem__ 
    return self.attrs[key] 
KeyError: 0 

回答

1

這裏的問題:

news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})[0] 
for news in news_list[0]: 

只是刪除這兩個[0]位之一,這個問題(或者至少這個問題,我不能保證你的代碼的其餘部分你想要做什麼)會走開。

我就不解釋了爲什麼代碼是錯誤的,因爲你真的需要學會調試代碼,並計算這些東西了自己。

開始在交互式解釋這樣做:

>>> huff_soup = BeautifulSoup(urllib2.urlopen("http://www.huffingtonpost.com").read()) 
>>> news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"}) 

見返回,什麼什麼形狀呢,你怎麼得到你想要的交互部分?一旦你知道了,應該很明顯的如何在你的腳本中做到這一點。

即使在事情太複雜以至於無法交互玩的情況下,您也可以使用打印語句記錄東西,在調試器中運行等。不要只盲目地盯着不起作用的代碼,並說「爲什麼不能'它工作嗎?',或者在某處發佈代碼,並詢問其他人爲什麼它不起作用,否則你將永遠無法學習任何東西。

+0

這是我使用Python的第3個小時。 – jason328

+1

@ jason328:我認爲你做事倒退了,從長遠看它會傷害你。嘗試以交互方式玩事物,然後考慮如何將它們變成健壯的腳本;不要嘗試先編寫健壯的腳本,然後再學習調試。在過去,人們必須提交手動卡片上的節目,並等待3個小時,看看他們是否工作,但我們不必再這樣做了。 – abarnert

+0

我同意。我只是在沒有時間玩事情的情況下。三個小時前我甚至沒有在電腦上安裝python。 – jason328

1

它看起來像news_list是一本字典(key-value對返回)並且沒有鑰匙0。如果這是一個你想要索引的列表,那就行得通了。因此,而不是你的

for news in news_list[0]:

線,儘量

for key, news in news_list.iteritems():

這將通過各自在字典中的項目的迭代。如果你只是想要第一個結果,我不知道你如何確定。嘗試打印出項目以確定返回的內容。

+0

我被帶'類型錯誤返回:NoneType對象不callable' – jason328

+0

他們也許你'find_all'沒有發現什麼?嘗試打印'news_list'。 – jozzas

+0

我現在正在使用'類型錯誤返回:「NoneType」對象不callable'再次 – jason328