2012-08-06 73 views
2

我已經爲for-loop構建了一個webscraper。我不知道爲什麼,但它返回一個url(這是我想要它返回的),然後在獲取列表中的下一個url之前,它返回一個NoneType對象。除了使腳本變慢,這不是什麼大問題,如果它不是因爲我不能打印比第一個url更多的內容。如何僅打印BeautifulSoup值?

from BeautifulSoup import BeautifulSoup 
from mechanize import Browser 
br = Browser() 
page = br.open("https://bdkv2.borger.dk/foa/Sider/default.aspx?fk=22&foaid=11541520") 
html = page.read() 
soup = BeautifulSoup(html) 
link = soup.findAll('a') 
kommunelink = link[21:116] 
for kommune in kommunelink: 
    kommuneside = br.open(kommune['href']) 
    html2 = kommuneside.read() 
    soup2 = BeautifulSoup(html2) 
    hjemmesidelink = soup2.find('a', id='_uscAncHomesite') 
    print hjemmesidelink['href'] 

這樣,我的輸出是這樣的:

http://www.albertslund.dk 

Traceback (most recent call last): 
File "C:\Users\kba\Desktop\kommuneskraber.py", line 14, in <module> 
print hjemmesidelink['href'] 
TypeError: 'NoneType' object has no attribute '__getitem__' 

我試着用一樣的東西瞎搞:如果變量==特定的類,然後印刷,但不起作用。例如:

If hjemmesidelink['href'] == <class 'BeautifulSoup.Tag'>: 
    print hjemmesidelink['href'] 

if hjemmesidelink.class == BeautifulSoup.Tag: 
    print hjemmesidelink['href'] 

任何想法應該如何?或者,甚至更好,任何想法,爲什麼我的腳本每次迭代通過循環時都會獲取'NoneType'對象?謝謝一堆。

+0

上面的代碼中的縮進是錯誤的,您能否確保您的代碼與您的python腳本完全相同? – 2012-08-06 14:00:51

+0

您仍然需要修復for循環中的縮進。 – 2012-08-06 14:22:15

+0

現在應該修復。 – kabp 2012-08-06 14:23:13

回答

1

這不是一個完整的答案,但如果你看看評論,這將回答只是關於不產生錯誤的部分。

在這部分代碼:

print hjemmesidelink['href'] 

替換:

if hjemmesidelink: 
    print hjemmesidelink['href'] 

if hjemmesidelink:檢查是否hjemmesidelink具有值,如果是,那麼它打印它,如果沒有,它將繼續循環。

我的結果:

>>> 
http://www.albertslund.dk 
http://www.alleroed.dk 
http://www.assens.dk 
http://www.ballerup.dk 
http://www.billund.dk 
http://www.brk.dk 
http://www.brondby.dk 
http://www.broenderslev.dk 
http://www.dragoer.dk 

和計數。

+0

令人驚歎。它的工作原理就是我所希望的,但卻很簡單。我仍然無所適從,爲什麼它會在它提取的每個url之間找到一個NoneType對象,但是這可以解決問題。謝謝一堆! – kabp 2012-08-06 14:45:53