获取链接的Beautifulsoup和Soupstrainer不与hasattr一起使用,总是返回true

时间:2013-07-30 10:01:55

标签: python python-3.x web-scraping beautifulsoup hasattr

我使用Beautifulsoup4和Soupstrainer与Python 3.3从网页获取所有链接。以下是重要的代码段:

r = requests.get(adress, headers=headers)
for link in BeautifulSoup(r.text, parse_only=SoupStrainer('a')):
    if hasattr(link, 'href'):

我测试了一些网页并且它运行良好,但今天使用

adress = 'http://www.goldentigercasino.de/'

我认识到hasattr(link,'href')总是返回TRUE,即使没有这样的'href'字段,就像在goldentigercasino.de例子中一样。 因为我很晚才使用链接['href'],因为它根本就不存在。

我也试过这样的解决方法:

test = requests.get('http://www.goldentigercasino.de/')
for link in BeautifulSoup(test.text, parse_only=SoupStrainer('a',{'href': not None})):

它按预期工作除了它还返回Doctype:

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"

由于与上述相同的原因,这也造成了麻烦。

我的问题:为什么hasattr总是返回true,我该如何解决?如果没有hasattr的可能性,我如何修复我的解决方法,它不返回DOCTYPE?

非常感谢和最诚挚的问候!

1 个答案:

答案 0 :(得分:3)

hasattr()错误的测试;它测试是否存在a.href属性,并且BeautifulSoup动态地将属性转换为对子项的搜索。 HTML标记属性已转换为Python属性。

改为使用字典式测试;你遍历所有可能包含DocType实例的元素,所以我使用getattr()来破坏没有属性的对象:

if 'href' in getattr(link, 'attrs', {}):

您还可以指示SoupStrainer仅将a标记与href属性匹配,href=Truekeyword argument filter not None在任何情况下都意味着True

for link in BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True)):

当然还包括HTML声明;只搜索a个链接:

soup = BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True))
for link in soup.find_all('a'):
    print link