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

相關問題