如何获取lxml中元素的路径?

46 投票
4 回答
49453 浏览
提问于 2025-04-15 15:07

我正在用Python的lxml库通过XPath在一个HTML文档中查找内容。我该如何获取某个元素的路径呢?这里有一个来自Ruby nokogiri的例子:

page.xpath('//text()').each do |textnode|
    path = textnode.path
    puts path
end

比如我想打印出'/html/body/div/div[1]/div[1]/p/text()[1]',这是我想在Python中获取的字符串。

4 个回答

14

如果你在代码中只有一个元素,并且想要获取这个元素的xpath(路径),那么你可以使用 element.getroottree().getpath(element) 这个方法来实现。

from lxml import etree

xml = '''
<test>
    <a/>
    <b>
       <i/>
       <ii/>
    </b>
</test>
'''
tree = etree.fromstring(xml)

for element in tree.iter():
    print element.getroottree().getpath(element)
20

可以查看一下lxml文档中的Xpath和XSLT,这里面有关于如何找到包含特定文本的元素路径的说明。

举个例子:

import cStringIO
from lxml import etree

f = cStringIO.StringIO('<foo><bar><x1>hello</x1><x1>world</x1></bar></foo>')
tree = lxml.etree.parse(f)
find_text = etree.XPath("//text()")

# and print out the required data
print [tree.getpath( text.getparent()) for text in find_text(tree)]

# answer I get is 
>>> ['/foo/bar/x1[1]', '/foo/bar/x1[2]']
71

使用 getpath 这个方法,它是属于 ElementTree 对象的。

from lxml import etree

root = etree.fromstring('''
    <foo><bar>Data</bar><bar><baz>data</baz>
    <baz>data</baz></bar></foo>
    ''')

tree = etree.ElementTree(root)
for e in root.iter():
    print(tree.getpath(e))

输出结果是

/foo
/foo/bar[1]
/foo/bar[2]
/foo/bar[2]/baz[1]
/foo/bar[2]/baz[2]

撰写回答