如何使用lxml查找与一组标记名称匹配的元素?
假设我想在以下XML树中找到所有a
和c
元素:
<foo>
<a/>
<b/>
<c/>
</foo>
我该怎么做?我想做类似foo.findall('./(a|b)')
的事情,但这不起作用。
答案 0 :(得分:2)
您使用union运算符处于正确的轨道,但正确的语法应如下所示:
foo.xpath('*[self::a|self::b]')
或简单地说:
foo.xpath('a|c')
请注意xpath()
优先于findall()
,因为前者提供对XPath 1.0的完全支持,而后者仅支持XPath 1.0表达式的有限子集。
答案 1 :(得分:0)
您可以将{regex与xpath()
一起使用。见Regular expressions in XPath
html = '''<foo>
<a/>
<b/>
<c/>
</foo>'''
import lxml.html
data = lxml.html.fromstring(html)
result = data.xpath('./*[re:match(local-name(), "a|b")]', namespaces={'re': "http://exslt.org/regular-expressions"})
print(result)
#print(list(x.tag for x in result))