Python 获取链接的Beautifulsoup和Soupstrainer与hasattr不起作用,返回始终为真
我正在使用Beautifulsoup4和Soupstrainer与Python 3.3一起从网页获取所有链接。以下是重要的代码片段:Python 获取链接的Beautifulsoup和Soupstrainer与hasattr不起作用,返回始终为真,python,python-3.x,web-scraping,beautifulsoup,hasattr,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.gold
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示例中所示。
正因为如此,我很晚才使用link['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的问题
非常感谢并致以最良好的问候 hasattr()
是错误的测试;它测试是否存在a.href
属性,并且BeautifulSoup动态地将属性转换为子级搜索。HTML标记属性不会转换为Python属性
改用字典式测试;您可以循环所有可以包括DocType
实例的元素,因此我使用getattr()
不中断没有属性的对象:
if 'href' in getattr(link, 'attrs', {}):
您还可以指示SoupStrainer
仅将a
标记与href
属性相匹配,方法是将href=True
用作(非无
在任何情况下仅表示True
):
当然,这仍然包括HTML声明;只搜索a
链接:
soup = BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True))
for link in soup.find_all('a'):
print link
谢谢你的回答,但你的最后一行代码给出的结果与我的解决方法相同。它为什么返回DOCTYPE?但是我会研究一下字典样式,但是我仍然对DOCTYPE案例感兴趣,它对我来说没有意义…@zwieback86:因为DOCTYPE从来没有被过滤过,文本元素也没有被过滤过。在整个对象上循环,而不仅仅是链接元素。查看我最近的更新。
soup = BeautifulSoup(test.text, parse_only=SoupStrainer('a', href=True))
for link in soup.find_all('a'):
print link