python - 使用 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?
谢谢你,托马斯
解决方案
我不太确定这是已引用问题的重复。该问题和答案似乎是遍历整个树,访问每个文本节点,而我将这个问题理解为简单地返回给定条件的特定节点的 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
当然,如果有可能无法找到或多次找到标准,我们还有更多工作要做,但我暂时认为这超出了问题的范围。
推荐阅读
- influxdb - 从 influxdb 查询一个月内服务器的工作和非工作时间平均/百分比利用率
- android - 应用更新后未收到设备 ID - FCM Firebase
- angular - 列表数组转换为对象
- java - Spring xml文件引用服务问题
- php - 避免 $ 在 php 上签名以从 json 打印数组值
- intellij-idea - 我无法在 IntelliJ Idea 中设置 Spring Social ShowCase 项目
- linux - 同时使用 wget 进行多个下载
- ubuntu-18.04 - 如何从快照应用程序中打开终端?
- python - Python编程_,看不懂这是什么代码
- android - 如何使用 android studio 和 android-box 调试 android TV 应用程序?