BeautifulSoup:AttributeError:'NavigableString'对象没有'name'属性

39 投票
4 回答
88450 浏览
提问于 2025-04-17 03:19

你知道为什么在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

撰写回答