1

我正在使用 Beautifulsoup4 和 Souptrainer 和 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 的解决方法?

致以真诚的感谢和诚挚的问候!

4

1 回答 1

4

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

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

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

您还可以通过使用关键字参数过滤器来指示仅SoupStrainer标签ahref属性匹配(仅表示在任何情况下):href=Truenot NoneTrue

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
于 2013-07-30T10:06:44.660 回答