2013-08-30 3 views
1

У меня есть документ:Как выбрать все текстовые узлы в документе?

<html> 
    <body> 
    <p>Hello World!</p> 
    <p>Goodbye!</p> 
    </body> 
</html> 

Я хотел бы, чтобы перебрать все текстовые узлы в документе, выполнять распознавание объектов с именем (этот компонент работает на простом вводе текста), а затем выводит XPath всех элементов которые передают мой алгоритм распознавания. Моя проблема в том, что я не знаю, как захватить все текстовые элементы в документе, не отбрасывая их информацию о xpath. Например,

root.xpath("//text()") 

Просто получается плоский массив строк:

['\n ', 'Hello World!', '\n ', 'Goodbye!', '\n '] 

Все структурная информация теряется, так что я не имею возможности сказать, где в документе каждая строка была. Есть ли способ лучше?

Вот полный источник:

import lxml.html 
import sys 
with open(sys.argv[1]) as fin: 
    text_string = fin.read() 
root = lxml.html.document_fromstring(text_string) 
text_elements = root.xpath("//text()") 
print text_elements 

ответ

2

Вы можете получить доступ к родительскому элементу, используя getparent():

>>> import lxml.html 
>>> text_string = '''<html> 
... <body> 
...  <p>Hello World!</p> 
...  <p>Goodbye!</p> 
... </body> 
... </html>''' 
>>> root = lxml.html.document_fromstring(text_string) 
>>> text_elements = root.xpath('//text()') 
>>> for t in text_elements: 
...  print t.getparent(), type(t), repr(t) 
... 
<Element body at 0x193b170> <class 'lxml.etree._ElementStringResult'> '\n ' 
<Element p at 0x193b1d0> <class 'lxml.etree._ElementStringResult'> 'Hello World!' 
<Element p at 0x193b1d0> <class 'lxml.etree._ElementStringResult'> '\n ' 
<Element p at 0x193b290> <class 'lxml.etree._ElementStringResult'> 'Goodbye!' 
<Element p at 0x193b290> <class 'lxml.etree._ElementStringResult'> '\n ' 
+0

Ах, я думал, что это была только простая строка, но оказывается, что это не так. Благодаря! – misha

Смежные вопросы