BeautifulSoup:AttributeError:'NavigableString'对象没有'name'属性
你知道为什么在BeautifulSoup教程的第一个例子中会出现 AttributeError: 'NavigableString' object has no attribute 'name'
这个错误吗?根据这个回答,HTML中的空格字符导致了这个问题。我尝试了几个页面的源代码,有一个能正常工作,其他的都出现了同样的错误(我去掉了空格)。你能解释一下“name”指的是什么,以及为什么会出现这个错误吗?谢谢。
4 个回答
9
你可以使用try catch来避免在循环中解析可导航字符串时出现的问题,像这样:
for j in soup.find_all(...)
try:
print j.find(...)
except NavigableString:
pass
38
在遍历树的时候,直接忽略 NavigableString
对象就可以了:
from bs4 import BeautifulSoup, NavigableString, Tag
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
for body_child in soup.body.children:
if isinstance(body_child, NavigableString):
continue
if isinstance(body_child, Tag):
print(body_child.name)
33
name
指的是标签的名字,如果这个对象是一个Tag
对象(比如说:<html>
的名字就是"html")。
如果你的标记中节点之间有空格,BeautifulSoup会把这些空格变成NavigableString
。所以如果你用contents
的索引来获取节点,你可能会得到一个NavigableString
,而不是下一个Tag
。
为了避免这种情况,可以直接查询你想要的节点:搜索解析树
或者如果你知道下一个想要的标签的名字,可以用这个名字作为属性,它会返回第一个匹配这个名字的Tag
,如果没有这样的子节点则返回None
:使用标签名作为成员
如果你想使用contents
,你需要检查你正在处理的对象。你遇到的错误意味着你在尝试访问名字属性,但代码认为它是一个Tag
。