BeautifulStoneSoup 属性错误:'NavigableString' 对象没有 'subtag' 属性

2 投票
2 回答
5788 浏览
提问于 2025-04-16 16:18

我正在尝试使用BeautifulSoup来解析一些看起来像这样的XML:

<a>
  <b>
    <c>
      <d attr="x">
        <e>
        </e>
        <name>
        </name>
      </d>
    </c>
    <c>
      ...
    <c>
  </b>
</a>

但是我不知道怎么在循环中访问ename。这个方法可以:

print soup.a.b.c.d.e

但是这个方法不行:

for subtag in soup.a.b.c:
    print subtag.d.e

反而出现了这个错误:

AttributeError: 'NavigableString' object has no attribute 'd'

还有一些不太相关的,这个:

print soup.a.b.c.d.name

只输出了d

我到底哪里做错了?我怀疑第二个问题我需要使用find(),因为那个对象已经有一个name属性了。有没有更好的方法呢?

2 个回答

1

这个:

print soup.a.b.c.d.name

只输出 d。

这是因为 name 和标签对象的内置 name 属性发生了冲突。根据文档中关于 将标签名作为成员使用 的说明,你可以使用 soup.a.b.c.d.nameTag 来代替。

关于 AttributeError 的解释在其他回答中讲得很清楚。如果你想提取整个文档中每一个 (d, e, name) 的组合,不管 d 标签出现在哪里,你可以这样做:

soup = BeautifulStoneSoup(doc)
for d in soup.findAll('d'):
    print (d, d.e, d.nameTag)
1

你遇到 AttributeError 错误是因为当你遍历 Tag 实例时,BeautifulSoup会返回 NavigableString 对象。也许你可以试试:

soup.a.b.c.findChildren()
#[<d attr="x">
#<e>
#</e>
#<name>
#</name>
#</d>, <e>
#</e>, <name>
#</name>]

关于 name 的问题:它被指定为一个属性,但你可以这样做:

soup.a.b.c.d.findChildren('name')
#[<name>
#</name>]

以下是供参考的设置代码:

from BeautifulSoup import BeautifulStoneSoup as bss
soup = bss(markup)

撰写回答