【问题标题】:How to select data for xml Element with specific attribute value?如何为具有特定属性值的 xml 元素选择数据?
【发布时间】:2011-06-02 06:06:21
【问题描述】:

给定:

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

我想获取键属性 = "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 ([)

【问题讨论】:

标签: python xml xpath elementtree


【解决方案1】:
您正在使用的

"[@attrib]" 仅在 ElementTree 1.3 中引入: http://effbot.org/zone/element-xpath.htm

仅在 Python 2.7 中引入:

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

正如这里的其他人所提到的,您需要以不同的方式获取此属性或升级 Python 才能使该代码正常工作。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 答案是 ET1.3 中没有引入“[@attrib]”——这是问题的关键部分。该链接仅证明了这一点。
【解决方案2】:

根据答案here,XPath 选择器功能直到 Python 2.7 附带的版本 1.3 才在 ElementTree 中实现,如@cdemerssaid

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 查看 Python 2.5 中包含的 ElementTree 的源代码,似乎不支持属性选择器。
    【解决方案4】:

    此 XPath 将选择 key 属性等于 falsebar 节点:

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

    如果当前上下文节点是foo 节点,那么这也可以:

    ./bar[@key='false']
    

    【讨论】:

    • 我以为是语法,但它返回并出错(请参阅对原始帖子的更新)。
    • @Will Merydith - 你确定当前的上下文节点是foo 吗?试试第一个例子。
    • 我很确定,因为我的其余代码都在工作(从这个 xml 中获取大量数据)。如果我尝试第一个示例,则会收到错误消息:“SyntaxError: cannot use absolute path on element”
    猜你喜欢
    • 2010-11-02
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2012-01-16
    • 1970-01-01
    • 2019-08-23
    • 2012-09-30
    相关资源
    最近更新 更多