使用ElementTree的findall()匹配元素文本
我正在尝试使用ElementTree的findall()函数,想要获取所有包含名字子元素<name>Kepler</name>
的<planet>
元素的列表。比如,我只想在下面的xml文件中返回前两个行星:
<planet>
<name>Kepler</name>
</planet>
<planet>
<name>Kepler</name>
</planet>
<planet>
<name>Newton</name>
</planet>
有没有什么优雅的方法可以做到这一点(除了找到所有的<planet>
元素然后逐个遍历)?我希望能有类似这样的方式:
root.findall(".//planet/name[text()=='Kepler']")
有什么提示吗?
1 个回答
2
快到了!在xpath中,下面这个是有效的(在lxml
中测试过,确保没问题!)
root.xpath('//planet[name[text()="Kepler"]]')
这个可以用另外一种方式写成:
root.xpath('//planet[name="Kepler"]')
现在,xml.etree
似乎不太喜欢前面的XPath
表达式(是不是说无效的谓词
?!)但对后面的没问题。好吧。那么我们就有:
root.findall('.//planet[name="Kepler"]')