首页 > 解决方案 > 使用 LXML 在 Python 中查找字符串的 XPath

问题描述

我正在尝试开发一个 Python 脚本,以便轻松提取 XML 或 HTML 文件中元素的 XPath。

例如,假设我们有下面的 XML 文件 (test.xml),我们希望为其获取 "blue" 的 XPATH:

<root>
  <element>
    <name>Element1</name>
    <contains>
      <element>
        <name>color</name>
        <value-ref>/Colors/red</value-ref>
      </element>
    </contains>
  </element>
  <element>
    <name>Colors</name>
    <contains>
      <element>
        <name>red</name>
        <value>0xFF0000</value>
      </element>
      <element>
        <name>blue</name>
        <value>0x0000FF</value>
      </element>
    </contains>
  </element>
</root>

我尝试使用 LXML,但我有点迷失:

from lxml import etree
doc = etree.parse('test.xml')
tree = etree.ElementTree(doc.getroot())

如何使用 text="blue" 获取树中元素的 XPath?

谢谢你,托马斯

标签: pythonlxml

解决方案


我不太确定这是已引用问题的重复。该问题和答案似乎是遍历整个树,访问每个文本节点,而我将这个问题理解为简单地返回给定条件的特定节点的 xpath - 在这种情况下是节点text()- 而不必访问每个节点。

上面给出的前三行实际上是正确的,您只需再添加一行即可得出最简单的答案:

from lxml import etree
doc = etree.parse('test.xml')
tree = etree.ElementTree(doc.getroot())

print(tree.getpath(doc.xpath('//*[contains(text(), "blue")]')[0]))

这给了我们结果:

(env) [tlum@localhost python-environments]$ python test.py
/root/element[2]/contains/element[2]/name

当然,如果有可能无法找到或多次找到标准,我们还有更多工作要做,但我暂时认为这超出了问题的范围。


推荐阅读