据我所知,这个问题不会重复,因为我已经寻找解决方案好几天了,根本无法确定问题。我正在尝试使用Python打印XML文档标记中的嵌套属性。我相信我遇到的错误与我试图从中获取信息的标签有多个属性有关。有没有什么方法可以指定我想要"第二个标记"标记中的"状态"值??非常感谢你的帮助。
我的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'
您在.find("second-tag")失败,而不是在.get.上失败
为了你想要的,为了你的习语,BeautifulSoup大放异彩。
from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(xml_string)
whatyouwant = soup.find('second-tag')['status']
我不知道使用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
这里的问题是没有名为second-tag
的标记。有一个名为{http://somewebsite.com/}second-tag
的标签。
你可以很容易地看到:
>>> print(root.getchildren())
[<Element '{http://somewebsite.com/}second-tag' at 0x105b24190>]
不符合名称空间的XML解析器可能会做错误的事情并忽略这一点,从而使代码正常工作。实际上,当您请求second-tag
时,向后弯曲以友好的解析器(如BeautifulSoup
)将自动尝试{http://somewebsite.com/}second-tag
。但ElementTree
两者都不是。
如果这还不是你需要知道的全部,你首先需要阅读一篇关于名称空间的教程(也许是这篇)。