我想在XML文件中搜索多个标签。
我可以分别评估这些命令:
tree.findall('.//title')
tree.findall('.//p')
但是我如何同时评估它们。我正在寻找类似.// title or .//p
我从SO帖子中尝试了此命令
tree.findall('.//(p|title)')
但我收到此追溯错误SyntaxError: invalid descendant
答案 0 :(得分:1)
尝试
tree.findall('.//p | .//title')
结果是两个节点集的并集。
答案 1 :(得分:1)
与其遍历两次树并加入节点集,不如执行一次遍历查找*
通配标签名称并通过self::
检查标签名称( reference):
tree.xpath("//*[self::p or self::title]")
演示:
In [1]: from lxml.html import fromstring
In [2]: html = """
...: <body>
...: <p>Paragraph 1</p>
...: <div>Other info</div>
...: <title>Title 1</title>
...: <span>
...: <p>Paragraph 2</p>
...: </span>
...: <title>Title 2</title>
...: </body>
...: """
In [3]: root = fromstring(html)
In [4]: [elm.text_content() for elm in root.xpath("//*[self::p or self::title]")]
Out[4]: ['Paragraph 1', 'Title 1', 'Paragraph 2', 'Title 2']