使用 LXML 在 Python 中查找字符串的 XPath

问题描述 投票:0回答:1

我正在尝试开发一个 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?

谢谢你, 托马斯

python lxml
1个回答
0
投票

我不太确定这是否与已引用的问题重复。这个问题和答案似乎遍历整个树,访问每个文本节点,而我将这个问题读为简单地返回给定条件的特定节点的 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

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

© www.soinside.com 2019 - 2024. All rights reserved.