我有类似这样的XML
#filename sample.xml
<tag>
<tag1>
<tag2 property="something"/>
<tag2 property="something1"/>
<tag2 property="something2">value</tag2>
<tag2 property="something3">
<tag3>
<tag4 data="data1"/>
<tag4 data="data2"/>
</tag3>
</tag2>
</tag1>
</tag>
我想提取'data1'
和'data2'
。我正在尝试这样的事情:
f=open('sample.xml')
fdata=f.read()
xmldata=BeautifulSoup(fadata)
print (xmldata.tag.tag1.tag2.tag3.tag4["data"])
但它引发了一个错误:
AttributeError: 'NoneType' object has no attribute 'tag4'
答案 0 :(得分:3)
print
功能由于多个tag2
而失败。解决方案是使用.findAll('tag2')
检索所有标记。
这是一个有效的例子:
#! /usr/bin/python
from bs4 import BeautifulSoup
f=open('sample.xml')
fdata=f.read()
xmldata=BeautifulSoup(fdata)
alltags2 = xmldata.tag.tag1.findAll('tag2')
for tag2 in alltags2:
alltags3 = tag2.findAll('tag3')
for tag3 in alltags3:
alltags4 = tag3.findAll('tag4')
for tag4 in alltags4:
print "The data I got was :\"%s\"" % (tag4["data"])
亲切的问候,
答案 1 :(得分:2)
一种可能的方法是使用select()
方法将CSS选择器语句作为参数传递。例如,如果您真的想严格选择具有此类祖先层次结构的<tag4>
:
.....
xmldata=BeautifulSoup(fadata)
for tag4 in xmldata.select("tag > tag1 > tag2 > tag3 > tag4"):
print tag4["data"]
以上将打印以下内容:
data1
data2
或者,如果您只需要XML中的所有<tag4>
个元素,就可以使用xmldata.select("tag4")
。