![](/img/trans.png)
[英]Python ElementTree - select element attributes based on value of 1 attribute
[英]ElementTree XPath - Select Element based on attribute
我在ElementTree中使用属性XPath Selector时遇到问题,我应该可以根据文档来做
这是一些示例代码
XML
<root>
<target name="1">
<a></a>
<b></b>
</target>
<target name="2">
<a></a>
<b></b>
</target>
</root>
蟒蛇
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或更低版本。
这段代码有几个问题。
Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有一个有限的子集例如,它不支持像//target
这样的从根目录查找 。
注意: 文档提到了“ // ”,但只针对孩子:所以表达式为.//target
是有效的; //...
不是!
还有一种替代实现: lxml更丰富。 对于内置代码,使用文档的接缝。 那不符合/工作。
@name
表示法选择xml- 属性 ; xml-tag中的key=value
表达式。
因此,名称值必须为1或2才能选择给定文档中的内容。 或者,可以使用子元素 “a”搜索目标: target[a]
(no @)。
对于给定的文档,使用内置的ElementTree(v1.3)解析为root,以下代码是正确的并且正常工作:
root.findall(".//target")
找到两个目标 root.findall(".//target/a")
找到两个a元素 root.findall(".//target[a]")
这会再次找到两个target-element,因为它们都有一个a元素 root.findall(".//target[@name='1']")
仅查找第一个目标。 请注意,需要大约1的引号; 否则会引发SyntaxError root.findall(".//target[a][@name='1']")
也有效; 找到那个目标 root.findall(".//target[@name='1']/a")
只查找一个a元素; ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.