2009-10-16 34 views
20

我在使用python中的lxml使用XPath的HTML文档中进行搜索。我如何获得某个元素的路径?下面是从红宝石引入nokogiri的例子:如何获取lxml中元素的路径?

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

打印例如 '/HTML /体/ DIV/DIV [1]/DIV [1]/P /文本()[1]',这是字符串我想要在Python中。

回答

38

使用来自ElementTree对象的getpath

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] 
+0

我认为它应该是'for e in tree.iter():',即** tree **。iter。 – Jabba 2011-09-17 23:05:20

+1

@Jabba你为什么这么想?你有没有尝试过我提供的代码?它似乎工作,不是吗?你是否有**理由**去思考否则? – nosklo 2011-09-29 15:11:40

+0

当你最初编写它时可能并不存在,而不是它实际上很重要,但是你也可以通过'tree = root.getroottree()'来获得一个ElementTree对象。 – 2017-04-13 18:36:38

17

Xpath and XSLT with lxml from the lxml documentation这给了元素的方含文字的路径

一个例子是

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]'] 
3
root = etree.parse(open('tmp.txt')) 

for e in root.iter(): 
    print root.getpath(e) 
2

如果你^ h在你的代码段中的元素是元素,你想元素的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)