如何为具有特定属性值的xml元素选择数据?

时间:2011-01-01 15:53:48

标签: python xml xpath elementtree

假设:

<foo>
 <bar key="true">text1</bar>
 <bar key="false">text2</bar>
 <bar key="true">text3</bar>
 <bar key="true">text4</bar>
</foo>

我想获取key属性=“false”的bar元素的文本。

我的应用程序是GAE上的Python 2.5.5。 XML不是真正的xml,但我可以将它作为ElementTree加载并正常获取数据。

代码示例:

result = urllib2.urlopen(url).read()
xml = ElementTree.fromstring(result)
str = xml.find("./bar").attrib['key']

获取第一个值。我已经尝试了各种xpath查询,我认为应该可以工作,但我显然有错误的语法。

更新:

str = xml.findtext("./bar[@key='false']")

引发错误:

  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/xml/etree/ElementPath.py", line 93, in __init__
    "expected path separator (%s)" % (op or tag)
SyntaxError: expected path separator ([)

4 个答案:

答案 0 :(得分:3)

我可能错了,但我不认为“./bar[@key='false']”符号在Python 2.5.5中起作用(或者至少不是随附的ElementTree)。我在Python 2.6.5中观察到了同样的问题,但它确实在Python 2.7.1中有效。我想你将不得不使用另一个库或尝试使用Python 2.7进行“实验性”GAE。

答案 1 :(得分:2)

此XPath将选择bar属性等于key的{​​{1}}个节点:

false

如果当前上下文节点是/foo/bar[@key='false'] 节点,那么这也将起作用:

foo

答案 2 :(得分:1)

根据答案here,在1.3版附带版本1.3之前,ElementTree中没有实现XPath选择器功能,该版本随Python @cdemers said一起提供。

答案 3 :(得分:0)

&#34; [@ ATTRIB]&#34;您正在使用的仅在ElementTree 1.3中引入: http://effbot.org/zone/element-xpath.htm

仅在Python 2.7中引入:

https://docs.python.org/2/library/xml.etree.elementtree.html

正如其他人提到的那样,您需要以不同的方式获取此属性,或者升级Python以使该代码生效。