使用ElementTree的findall()匹配元素文本

1 投票
1 回答
4141 浏览
提问于 2025-04-18 06:21

我正在尝试使用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"]')

撰写回答