Python lxml : how to get human-readable XPath for XML element?

标签 python xpath lxml

我有一个简短的 XML 文档:

<tag1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://example.com/2009/namespace">
    <tag2>
        <tag3/>
        <tag3/>
    </tag2>
</tag1>

一个简短的 Python 程序像这样加载这个 XML 文件:

from lxml import etree

f = open( 'myxml.xml' )
tree = etree.parse(f)
MY_NAMESPACE = 'http://example.com/2009/namespace'
xpath = etree.XPath( '/f:tag1/f:tag2/f:tag3', namespaces = { 'f': MY_NAMESPACE } )
# get first element that matches xpath
elem = xpath(tree)[0]
# get xpath for an element 
print tree.getpath(elem)

我希望通过这段代码获得一个有意义的、人类可读的 xpath,然而,我却得到了一个类似 /*/*/*[1] 的字符串。

知道是什么原因造成的吗?我该如何诊断这个问题?

注意:使用 Python 2.7.9 和 lxml 2.3

最佳答案

看起来 getpath()(底层 libxml2 调用 xmlGetNodePath)为命名空间文档生成位置表达式 xpath。 评论部分的用户 mzjn 指出,自 lxml v3.4.0 以来,函数 getelementpath() 生成具有完全限定标签名称(使用 "Clark notation" )的人类可读的 xpath。此函数通过从节点向上遍历树而不是使用 libxml2 API 调用来生成 xpath。

同样,如果lxml v3.4+不可用,可以自己写一个树遍历函数。

关于Python lxml : how to get human-readable XPath for XML element?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049442/

相关文章:

python - python从xml文件中读取数据的方法

python - 我需要 objectify.SubElement 的 polyfill

python - 是否可以将更强大的 HTML 解析器连接到 Python Mechanize ?

python - 对 pandas DataFrame 进行矢量化更新?

python - 无法让 timeit 与 numpy 一起运行

selenium - 如何获取Span内的文本

python - 计算 Pandas 数据框中的平均真实范围列

c# - 为什么 XmlDocument 有一个未在任何地方声明的命名空间(AFAIK)?

ruby - 我如何使用 Nokogiri 创建一个独特的阵列?

python lxml 添加一个保留所有父树的子元素