PythonのlxmlからXPathを使用してHTMLドキュメントを検索しています。特定の要素へのパスを取得するにはどうすればよいですか?これがRuby nokogiri:
page.xpath('//text()').each do |textnode|
path = textnode.path
puts path
end
たとえば、 '/ html/body/div/div [1]/div [1]/p/text()[1]'を出力します。これは、Pythonで取得したい文字列です。
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]
lxmlドキュメントのlxmlを使用したXpathおよび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]']
コードのセクションにあるのが要素だけで、要素の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)
root = etree.parse(open('tmp.txt'))
for e in root.iter():
print root.getpath(e)