【问题标题】:Beautifulsoup and Soupstrainer for getting links dont work with hasattr, returning always true用于获取链接的 Beautifulsoup 和 Souptrainer 不适用于 hasattr,总是返回 true
【发布时间】:2013-07-30 10:01:54
【问题描述】:

我正在使用 Beautifulsoup4 和 Soupstrainer 以及 Python 3.3 来获取网页中的所有链接。以下是重要代码-sn-p:

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 的解决方法?

非常感谢和最好的问候!

【问题讨论】:

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


    【解决方案1】:

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

    改为使用字典式测试;您循环遍历可以包含 DocType 实例的 all 元素,因此我使用 getattr() 来不中断没有属性的对象:

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

    您还可以通过将href=True 用作keyword argument filter 来指示SoupStrainer 仅将a 标记与href 属性匹配(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
    

    【讨论】:

    • 感谢您的回答,但您最后的代码行给我的结果与我的解决方法相同。为什么它返回 DOCTYPE?但我会看看字典样式,但我仍然对 DOCTYPE 案例感兴趣,这对我来说没有意义......
    • @zwieback86:因为文档类型永远不会被过滤,文本元素也不会。您正在循环遍历 full 对象,而不仅仅是链接元素。查看我最近的更新。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多