[英]Python ElementTree: find element by its child's text using XPath
我正在尝试在其子节点中找到具有某些文本值的元素。 例如,
<peers>
<peer>
<offset>1</offset>
<tag>TRUE</tag>
</peer>
<peer>
<offset>2</offset>
<tag>FALSE</tag>
</peer>
</peers>
从这个XML文档中我想直接在offset
值为1的peer
元素中定位tag
。
所以为此我有一个XPath表达式如下:
./peers/peer[offset='1']/tag
但是在ElementTree的Element.find()
方法中使用这样的表达式失败并且给出None
而不是我感兴趣的“tag”元素:
from xml.etree.ElementTree import fromstring
doc = fromstring("<peers><peer><offset>1</offset><tag>TRUE</tag></peer><peer><offset>2</offset><tag>FALSE</tag></peer></peers>")
tag = doc.find("./peers/peer[offset='1']/tag")
print tag
=> None
我倾向于认为它是我上面的XPath表达式错误,或者是由于ElementTree根据其文档仅支持XPath的一个子集。 寻求帮助。 谢谢。
使用lxml.etree
直接(同样应适用于ElementTree
),就可以实现这样的结果:
doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
tag_elements
将是属于<peer>
元素的<tag>
元素列表 ,其中包含一个包含1的<offset>
元素。
给定输入(我添加了一个<peer>
子句来强调tag_elements
是一个列表):
<peers>
<peer>
<offset>1</offset>
<tag>TRUE</tag>
</peer>
<peer>
<offset>1</offset>
<tag>OTHER</tag>
</peer>
<peer>
<offset>2</offset>
<tag>FALSE</tag>
</peer>
</peers>
tag_elements
将包含两个元素:
for tag in tag_elements:
print tag.text
-> TRUE
-> OTHER
更新 :
doc.xpath("/peers/peer[offset=1]/tag")
也可以正常工作。
但是doc.xpath("./peers/peer[offset=1]/tag")
没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.