使用BeautifulSoup或minidom解析XML

时间:2015-03-21 19:03:06

标签: python xml-parsing beautifulsoup minidom

我有类似这样的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'

2 个答案:

答案 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")