2013-08-30 5 views
1

J'ai un document:Comment sélectionner tous les nœuds de texte dans un document?

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

Je voudrais itérer sur tous les nœuds de texte dans le document, effectuer une reconnaissance d'entités nommées (ce composant fonctionne sur l'entrée de texte brut) puis sortie XPath de tous les éléments cela passe mon algorithme de reconnaissance. Mon problème est que je ne sais pas comment saisir tous les éléments de texte dans le document sans ignorer leurs informations xpath. Par exemple,

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

cède Juste un tableau associatif de chaînes:

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

Toutes les informations structurelles est perdu, donc j'ai aucun moyen de dire où dans le document chaque chaîne était. Y a-t-il un meilleur moyen?

est ici la source complète:

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 

Répondre

2

Vous pouvez accéder à l'élément parent à l'aide 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

Ah, je pensais que c'était juste une chaîne simple, mais il se trouve qu'il est pas. Merci! – misha

Questions connexes