BeautifulSoup报”AttributeError: ‘NavigableString’ object has no attribute ‘find_all’ “的原因以及解决办法

问题描述

在使用BeautifulSoup解析html代码时,报出了"AttributeError: 'NavigableString' object has no attribute 'find_all' "的错误。

错误原因

在BeautifulSoup中,find_all()是一个方法用于筛选文档的tag或者字符串。然而,当我们对一个NavigableString对象(字符串)使用该方法时,就会引发"AttributeError: 'NavigableString' object has no attribute 'find_all'"的错误。这是因为NavigableString没有find_all()方法。

解决办法

  1. 在解析字符串时,尽量使用html.parser,而不是lxml或者html5lib。因为html.parser对于字符串解析出来的结果已经是tag类型了,而lxml或者html5lib解析后的结果是NavigableString类型,这样就会导致使用find_all()方法时出错。可以通过下列语句指定解析器:

    soup = BeautifulSoup(html_doc, 'html.parser')

  2. 在使用find_all()方法之前,先判断对象类型是否为tag。可以使用以下代码:

    if type(obj) == bs4.element.Tag:
        # 对象为tag类型,可以使用find_all()方法
    else:
        # 对象为NavigableString类型,处理该字符串
  3. 将字符串转化为tag类型。如果出现该错误就说明程序已经将某些字符串转化为了NavigableString类型导致了错误。可以手动将字符串转化为tag类型,然后再进行操作。可以使用以下方法:

    from bs4.element import Tag
    obj = Tag(None, 'string')
    obj.string = 'string'
    # 这样obj就是一个tag类型,可以使用find_all()方法进行操作

如果以上三种方法都行不通,那么可能是代码逻辑出现了问题,需要重新检查代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:BeautifulSoup报”AttributeError: ‘NavigableString’ object has no attribute ‘find_all’ “的原因以及解决办法 - Python技术站

(0)
上一篇 2023年3月20日
下一篇 2023年3月20日

相关文章

合作推广
合作推广
分享本页
返回顶部