我正在尝试使用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
属性。有更好的方式吗?
答案 0 :(得分:1)
当您遍历AttributeError
个实例时,会得到Tag
,因为BSS returns NavigableString
s。也许你想尝试:
soup.a.b.c.findChildren()
#[<d attr="x">
#<e>
#</e>
#<name>
#</name>
#</d>, <e>
#</e>, <name>
#</name>]
关于问题w / name
:它是specified as an attribute,但您可以这样做:
soup.a.b.c.d.findChildren('name')
#[<name>
#</name>]
设置代码供参考:
from BeautifulSoup import BeautifulStoneSoup as bss
soup = bss(markup)
答案 1 :(得分:1)
这样:的
print soup.a.b.c.d.name
仅输出d。
这是因为name
与Tag对象的内置name
属性冲突。根据{{3}}上的文档,您可以改为使用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)