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

4

给定:

<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 ([)

findtext似乎是使用xpath的一种奇怪方式,特别是考虑到https://dev59.com/X3VD5IYBdhLWcg3wWKPc显示了不同的方法。 - Andrew T Finnell
Merydith:请使用完整的XPath引擎,例如lxml,而不是基本的ElementTree API。 - user357812
4个回答

3

我可能错了,但我认为在Python 2.5.5中不支持"./bar[@key='false']"这种表示方式(至少默认的ElementTree不支持)。我在Python 2.6.5中也遇到了同样的问题,但在Python 2.7.1中可以使用。我猜你需要使用另一个库或尝试使用带有Python 2.7的“实验性”GAE。


查看Python 2.5中包含的ElementTree源代码,似乎不支持属性选择器。 - Nick Farina

2

这个XPath将选择bar节点,其key属性等于false

/foo/bar[@key='false']

如果当前上下文节点是foo节点,则以下内容也有效:

./bar[@key='false']

我以为那是语法,但它返回了一个错误(请参见原帖的更新)。 - Will Curran
@Will Merydith - 你确定当前上下文节点是 foo 吗?尝试第一个例子。 - Oded
我非常确定,因为我的其余代码正在工作(从此xml中获取了大量数据)。如果我尝试第一个示例,我会收到错误消息:“SyntaxError:cannot use absolute path on element”。 - Will Curran

1

根据这里的回答,XPath选择器功能直到ElementTree 1.3版本才得以实现,该版本随Python 2.7一起发布,正如@cdemers所说。


0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Mamoun Benghezal
答案是,在ET1.3中没有引入“[@attrib]”,这是问题的关键部分。链接只是证明了这一点。 - aaviram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接