Nic*_*tes 42 python elementtree
我在ElementTree中使用属性XPath Selector时遇到问题,我应该可以根据文档来做
这是一些示例代码
XML
<root>
<target name="1">
<a></a>
<b></b>
</target>
<target name="2">
<a></a>
<b></b>
</target>
</root>
Run Code Online (Sandbox Code Playgroud)
蟒蛇
def parse(document):
root = et.parse(document)
for target in root.findall("//target[@name='a']"):
print target._children
Run Code Online (Sandbox Code Playgroud)
我收到以下例外:
expected path separator ([)
Run Code Online (Sandbox Code Playgroud)
Flo*_*sch 34
您尝试使用的语法是ElementTree 1.3中的新增功能.
此版本随Python 2.7或更高版本一起提供.如果您使用的是Python 2.6或更低版本,那么您仍然可以使用ElementTree 1.2.6或更低版本.
Alb*_*ert 19
这段代码有几个问题.
Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有有限的子集例如,它不支持像root这样的find-from-root表达式//target.
注意:文档
提到了" // ",但仅针对儿童:所以表达式
.//target是有效的; //...不是!
还有一种替代实现:lxml更丰富.对于内置代码,使用文档的接缝.那不符合/工作.
的@name符号选择XML- 属性 ; key=valuexml-tag中的表达式.
因此,名称值必须为1或2才能选择给定文档中的内容.或者,可以使用子元素 "a"搜索目标:( target[a]不是@).
对于给定的文档,使用内置的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的引号; 否则会引发SyntaxErrorroot.findall(".//target[a][@name='1']")也有效; 找到那个目标root.findall(".//target[@name='1']/a")只找到一个a元素; ...