2009-10-16 10 views
20

私はpythonでlxmlのXPathを使ってHTML文書を検索しています。どのようにして特定の要素へのパスを取得できますか? '[1]/DIV [1]/P /テキスト()/HTML /ボディ/ DIV/DIV [1]' 例えばlxmlの要素のパスを取得するには?

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

印刷し、これは次のとおりです。ここではルビーの鋸山からの例ですstring私は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

私はそれがtree.iter(): 'for e、つまり** tree **。iterであるべきだと思います。 – Jabba

+1

@ジャバあなたはなぜそれをどう思いますか?私がそれを提供したコードを試しましたか?それはうまくいくように見えますか?そうしないと考える理由**がありますか? – nosklo

+0

これはもともとこれを書いたときには存在しなかったかもしれませんが、実際には重要ではありませんが、 'tree = root.getroottree()'を実行して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) 
関連する問題