Python元素树:按其子元素查找元素';使用XPath创建文本
我正在试图定位一个元素,该元素在其子元素中具有特定的文本值。 比如说,Python元素树:按其子元素查找元素';使用XPath创建文本,python,xml,xpath,elementtree,Python,Xml,Xpath,Elementtree,我正在试图定位一个元素,该元素在其子元素中具有特定的文本值。 比如说, <peers> <peer> <offset>1</offset> <tag>TRUE</tag> </peer> <peer> <offset>2</offset> <tag>FALSE</tag&g
<peers>
<peer>
<offset>1</offset>
<tag>TRUE</tag>
</peer>
<peer>
<offset>2</offset>
<tag>FALSE</tag>
</peer>
</peers>
但是,在ElementTree的元素.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
from xml.etree.ElementTree导入fromstring
doc=fromstring(“1TRUE2FALSE”)
tag=doc.find(“./peers/peer[offset='1']/tag”)
打印标签
=>无
我倾向于认为要么我上面的XPath表达式是错误的,要么是因为ElementTree的文档只支持XPath的一个子集。
正在寻求帮助。谢谢。直接使用
lxml.etree
(这同样适用于ElementTree
),您可以实现如下结果:
doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
标记元素
将是
元素的列表,这些元素属于
元素,包含
元素,该元素包含1
给定输入(我添加了一个
子句以强调标记元素
是一个列表):
更新:
doc.xpath(“/peers/peer[offset=1]/tag”)
也可以正常工作
但是
doc.xpath(“./peers/peer[offset=1]/tag”)
没有问题。您的xpath表达式非常好,在ElementTree
中尝试您的建议会引发语法错误:无法在元素上使用绝对路径当被问及在ElementTree
中使用XPath时,我看到许多人提到lxml
。我真的应该改用lxml
吗?就我个人而言,我放弃了ElementTree
。。。我可以很好地使用lxml.etree
。
doc = lxml.etree.fromstring(...)
tag_elements = doc.xpath("/peers/peer/offset[text()='1']/../tag")
<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>
for tag in tag_elements:
print tag.text
-> TRUE
-> OTHER