Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取链接的Beautifulsoup和Soupstrainer与hasattr不起作用,返回始终为真_Python_Python 3.x_Web Scraping_Beautifulsoup_Hasattr - Fatal编程技术网

Python 获取链接的Beautifulsoup和Soupstrainer与hasattr不起作用,返回始终为真

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

我正在使用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示例中所示。 正因为如此,我很晚才使用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