使用带有xpath的lxml findall()查找多种类型的标签?

时间:2018-07-15 15:49:36

标签: python xml lxml

我想在XML文件中搜索多个标签。

我可以分别评估这些命令:

tree.findall('.//title')
tree.findall('.//p')

但是我如何同时评估它们。我正在寻找类似.// title or .//p

的语法

我从SO帖子中尝试了此命令

tree.findall('.//(p|title)')

但我收到此追溯错误SyntaxError: invalid descendant

2 个答案:

答案 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']