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

Flu*_*ffy 30 python xpath lxml

我正在使用Python中的lxml中的XPath在HTML文档中搜索.我怎样才能获得某个元素的路径?这是ruby nokogiri的例子:

page.xpath('//text()').each do |textnode|
    path = textnode.path
    puts path
end
Run Code Online (Sandbox Code Playgroud)

打印例如' / html/body/div/div [1]/div [1]/p/text()[1] '这是我想在python中获取的字符串.

nos*_*klo 54

使用getpathElementTree对象.

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)
Run Code Online (Sandbox Code Playgroud)

打印

/foo
/foo/bar[1]
/foo/bar[2]
/foo/bar[2]/baz[1]
/foo/bar[2]/baz[2]
Run Code Online (Sandbox Code Playgroud)

  • @Jabba你为什么这么认为?您是否尝试过我提供的代码?它似乎有效,不是吗?你有**的理由**不这么认为吗? (2认同)

use*_*019 19

请参阅lxml文档中带有lxmlXpath和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]']
Run Code Online (Sandbox Code Playgroud)


shr*_*use 7

如果您在代码部分中拥有的只是元素,并且您希望元素的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)
Run Code Online (Sandbox Code Playgroud)


wp-*_*com 5

root = etree.parse(open('tmp.txt'))

for e in root.iter():
    print root.getpath(e)
Run Code Online (Sandbox Code Playgroud)