2009-10-16 9 views
20

저는 파이썬에서 lxml의 XPath를 사용하여 HTML 문서를 검색하고 있습니다. 특정 요소에 대한 경로를 얻으려면 어떻게해야합니까? 여기 루비 노코 기리의 예이다 : 예lxml에서 요소의 경로를 얻는 방법은 무엇입니까?

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

프린트 '/HTML/바디/DIV/DIV [1]/DIV [1]/P/텍스트() [1]을'이이있다 string 파이썬으로 들어가고 싶다.

답변

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

나는 tree.iter() :'** tree **. iter. – Jabba

+1

@Jabba 그리고 왜 그렇게 생각하니? 내가 제공 한 코드를 사용해 보셨습니까? 일하는 것 같은데, 안 그래? 그렇지 않으면 생각할 ** 이유 **가 있습니까? – nosklo

+0

원래 작성했을 때 실제로 존재하지 않을 수도 있지만, tree = root.getrootree()를 사용하여 ElementTree 객체를 얻을 수도 있습니다. –

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

될 텍스트를 containg 요소의 경로를 제공하는 모든 당신이 시간이면 코드 섹션에서 ave가 요소이고 요소의 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) 
관련 문제