BeautifulStoneSoup 属性错误:'NavigableString' 对象没有 'subtag' 属性
我正在尝试使用BeautifulSoup来解析一些看起来像这样的XML:
<a>
<b>
<c>
<d attr="x">
<e>
</e>
<name>
</name>
</d>
</c>
<c>
...
<c>
</b>
</a>
但是我不知道怎么在循环中访问e
或name
。这个方法可以:
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)