2013-08-30 127 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

相关问题