BeautifulStoneSoup AttributeError:'NavigableString'对象没有属性'subtag'

时间:2011-04-23 23:01:10

标签: python xml beautifulsoup

我正在尝试使用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 个答案:

答案 0 :(得分:1)

当您遍历AttributeError个实例时,会得到Tag,因为BSS returns NavigableStrings。也许你想尝试:

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)