XML Python使用ElementTree选择众多属性中的一个

时间:2013-07-03 19:19:37

标签: python xml elementtree

据我所知,这个问题并不重复,因为我现在一直在寻找解决方案,而且根本无法解决问题。我试图使用Python从XML文档标记打印嵌套属性。我相信我遇到的错误与我正在尝试获取信息的标签有多个属性这一事实有关。有没有什么方法可以指定我想要“second-tag”标签中的“status”值?非常感谢您的帮助。

我的XML文档'test.xml':

<?xml version="1.0" encoding="UTF-8"?>
<first-tag xmlns="http://somewebsite.com/" date-produced="20130703" lang="en" produced-   by="steve" status="OFFLINE">
    <second-tag country="US" id="3651653" lang="en" status="ONLINE">
    </second-tag>
</first-tag>

我的Python文件:

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
whatiwant = root.find('second-tag').get('status')
print whatiwant

错误:

AttributeError: 'NoneType' object has no attribute 'get'

3 个答案:

答案 0 :(得分:2)

你在.find('second-tag')失败,而不是.get。

为了你想要的和你的成语,BeautifulSoup闪耀。

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(xml_string)
whatyouwant = soup.find('second-tag')['status']

答案 1 :(得分:0)

我不知道elementtree,但我会用ehp或easyhtmlparser这样做 链接在这里。 http://easyhtmlparser.sourceforge.net/ 一位朋友告诉我这个工具我还在学习那么好又简单。

from ehp import *

data = '''<?xml version="1.0" encoding="UTF-8"?>
<first-tag xmlns="http://somewebsite.com/" date-produced="20130703" lang="en" produced-   by="steve" status="OFFLINE">
    <second-tag country="US" id="3651653" lang="en" status="ONLINE">
    </second-tag>
</first-tag>'''

html  = Html()
dom   = html.feed(data)
item = dom.fst('second-tag')
value = item.attr['status']
print value

答案 2 :(得分:0)

这里的问题是这里没有名为second-tag的标签。有一个名为{http://somewebsite.com/}second-tag的标签。

你可以很容易地看到这一点:

>>> print(root.getchildren())
[<Element '{http://somewebsite.com/}second-tag' at 0x105b24190>]

非符合命名空间的XML解析器可能会做错事并忽略它,使您的代码工作。当您要求BeautifulSoup时,向后弯曲为友好的解析器(如{http://somewebsite.com/}second-tag)实际上会自动尝试second-tag。但是ElementTree既不是。

如果这不是您需要了解的全部内容,首先需要阅读有关命名空间的教程(可能是this one)。