2009-10-16 17 views
20

मैं पाइथन में lxml से XPath का उपयोग कर एक HTML दस्तावेज़ में खोज रहा हूं। मैं एक निश्चित तत्व के लिए रास्ता कैसे प्राप्त कर सकता हूं? यहाँ माणिक nokogiri से उदाहरण है:lxml में किसी तत्व का पथ कैसे प्राप्त करें?

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

उदाहरण के लिए प्रिंट '/html/शरीर/div /) div [1]/div [1]/पी/पाठ ([1]' और यह है स्ट्रिंग मैं पायथन में जाना चाहता हूँ।

उत्तर

38

एलिमेंटट्री ऑब्जेक्ट्स से 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

मुझे लगता है कि यह पेड़.आईटर() में ई के लिए होना चाहिए: ', यानी ** पेड़ **। Iter। – Jabba

+1

@ जब्बा और आप ऐसा क्यों सोचते हैं? क्या आपने जिस कोड को प्रदान किया है, वह आपने कोशिश की है? ऐसा लगता है, नहीं? क्या आपके पास अन्यथा सोचने के लिए ** कारण ** है? – nosklo

+0

यह तब अस्तित्व में नहीं था जब आपने इसे मूल रूप से लिखा था और यह वास्तव में महत्वपूर्ण नहीं है, लेकिन आप ElementTree ऑब्जेक्ट प्राप्त करने के लिए 'tree = root.getroottree()' भी कर सकते हैं। –

17

Xpath and XSLT with lxml from the lxml documentation देखें यह पाठ containg तत्व के रास्ते देता

एक उदाहरण

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

होगा आप सभी ज हैं कोड के आपके अनुभाग में एवी तत्व है और आप तत्व का 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) 
संबंधित मुद्दे