问题描述
在使用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()方法。
解决办法
-
在解析字符串时,尽量使用html.parser,而不是lxml或者html5lib。因为html.parser对于字符串解析出来的结果已经是tag类型了,而lxml或者html5lib解析后的结果是NavigableString类型,这样就会导致使用find_all()方法时出错。可以通过下列语句指定解析器:
soup = BeautifulSoup(html_doc, 'html.parser')
-
在使用find_all()方法之前,先判断对象类型是否为tag。可以使用以下代码:
if type(obj) == bs4.element.Tag: # 对象为tag类型,可以使用find_all()方法 else: # 对象为NavigableString类型,处理该字符串
-
将字符串转化为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技术站