我在 ElementTree 中使用属性 XPath 选择器时遇到问题,我应该能够根据 文档

这是一些示例代码

XML

<root>
 <target name="1">
    <a></a>
    <b></b>
 </target>
 <target name="2">
    <a></a>
    <b></b>
 </target>
</root>

Python

def parse(document):
    root = et.parse(document)
    for target in root.findall("//target[@name='a']"):
        print target._children

我收到以下异常:

expected path separator ([)
有帮助吗?

解决方案

您尝试使用的语法是 ElementTree 1.3 中的新语法

此类版本附带 Python 2.7 或更高版本。 如果你有Python 2.6或更低版本,你仍然有ElementTree 1.2.6或更少。

其他提示

这段代码有几个问题。

  1. Python 的内置 ElementTree(简称 ET)没有真正的 XPATH 支持;仅有限的子集 例如,它不支持 从根目录查找 表达如 //target.

    注意:这 文档提到“//”,但仅适用于儿童:所以表达式为.//target 已验证; //... 不是!

    有一个替代实现: lxml 哪个更丰富。对于内置代码来说,这是使用文档的接缝。那不匹配/工作。

  2. @name 表示法选择 xml-属性;这 key=value xml 标签内的表达式。

    因此名称-值必须是 1 或 2 才能在给定文档中选择某些内容。或者,可以带着孩子搜索目标 元素 'A': target[a] (不 @)。

对于给定的文档,使用内置 ElementTree (v1.3) 解析为 root,以下代码是正确且有效的:

  • root.findall(".//target") 找到两个目标
  • root.findall(".//target/a") 找到两个a元素
  • root.findall(".//target[a]") 这会再次找到两个目标元素,因为两者都有一个 a 元素
  • root.findall(".//target[@name='1']") 仅查找 第一的 目标。请注意,需要 1 左右的引号;否则会引发语法错误
  • root.findall(".//target[a][@name='1']") 也有效;找到那个目标
  • root.findall(".//target[@name='1']/a") 只找到一个 a 元素;...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top