我使用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?
非常感谢和最诚挚的问候!
答案 0 :(得分:3)
hasattr()
是错误的测试;它测试是否存在a.href
属性,并且BeautifulSoup动态地将属性转换为对子项的搜索。 HTML标记属性不已转换为Python属性。
改为使用字典式测试;你遍历所有可能包含DocType
实例的元素,所以我使用getattr()
来破坏没有属性的对象:
if 'href' in getattr(link, 'attrs', {}):
您还可以指示SoupStrainer
仅将a
标记与href
属性匹配,href=True
为keyword 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