2012-08-06 74 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