Подтвердить что ты не робот

Как получить путь к элементу в lxml?

Я ищу в HTML-документе, используя XPath из lxml в python. Как я могу получить путь к определенному элементу? Вот пример из ruby ​​nokogiri:

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

напечатайте, например, /html/body/div/div [1]/div [1]/p/text() [1] ', и это строка, в которую я хочу попасть питон.

4b9b3361

Ответ 1

Используйте getpath из объектов ElementTree.

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]

Ответ 2

Смотрите Xpath и XSLT с lxml из документации lxml Это дает путь к элементу, содержащему текст

Примером может быть

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

Если все, что у вас есть в вашем разделе кода, является элементом, и вы хотите, чтобы элемент 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)

Ответ 4

root = etree.parse(open('tmp.txt'))

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