.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
代替stdlibxml.etree
?它通常作为一个替代品,在这里提供了一个更好的答案。etree API的lxml
实现是否支持XPath中的
?如果是这样的话,这可能是OP的一个可接受的替代方案。@abarnert:lxml
支持所有XPath 1.0。是的,我只是不确定它的etreefindall
中是否有完整的XPath(出于某种原因,它不是在我坐的机器上构建的,所以我无法测试…。@abarnert:no,()
是此处使用的方法.findall()
与原始API实现保持bug兼容。谢谢,我无法从网页或任何其他解释中找到您可以使用xpath的(a | b)。尽管lxml是最好的工具之一,但文档非常糟糕。
log.xpath('.//(element1|element2)')