.findall()能否匹配python etree中的多个值?

.findall()能否匹配python etree中的多个值?,python,xml.etree,Python,Xml.etree,是否有方法使用.findall()匹配树中的多个元素 我想这样做: trees = log.findall('element1' or 'element2') 这是我的解决方法(在我的例子中是有效的,因为我没有在同一个XML中同时使用e1和e2): 我正在解析结构相似但名称不同的XML文件。C#允许“element1 | element2”匹配 不,你不能。C#似乎在使用XPath表达式,但是太有限了,不包括对此的支持 如果第一个搜索为空,您可以使用或选择第二个搜索: trees = log.

是否有方法使用
.findall()
匹配树中的多个元素

我想这样做:

trees = log.findall('element1' or 'element2')
这是我的解决方法(在我的例子中是有效的,因为我没有在同一个XML中同时使用e1和e2):

我正在解析结构相似但名称不同的XML文件。C#允许“element1 | element2”匹配

不,你不能。C#似乎在使用XPath表达式,但是太有限了,不包括对此的支持

如果第一个搜索为空,您可以使用
选择第二个搜索:

trees = log.findall('element1') or log.findall('element2')
因为空结果为false-y

另一种选择是使用
libxml2
之上的ElementTreeAPI实现,该实现。然后你可以做:

log.xpath('.//(element1|element2)')

考虑到您的解决方案,如果element1和element2中都有元素,该怎么办?很好。为了更清楚,我编辑了这个问题。我是一个既可以使用1也可以使用2的代码,决不能同时使用2。@user3769076:您是否可以要求
lxml
并使用
lxml.etree
代替stdlib
xml.etree
?它通常作为一个替代品,在这里提供了一个更好的答案。etree API的
lxml
实现是否支持XPath中的
?如果是这样的话,这可能是OP的一个可接受的替代方案。@abarnert:
lxml
支持所有XPath 1.0。是的,我只是不确定它的etree
findall
中是否有完整的XPath(出于某种原因,它不是在我坐的机器上构建的,所以我无法测试…。@abarnert:no,
()
是此处使用的方法
.findall()
与原始API实现保持bug兼容。谢谢,我无法从网页或任何其他解释中找到您可以使用xpath的(a | b)。尽管lxml是最好的工具之一,但文档非常糟糕。
log.xpath('.//(element1|element2)')