2010-08-18 14 views
7

Encore en train d'apprendre lxml. J'ai découvert que parfois je ne peux pas accéder au texte d'un élément d'un arbre en utilisant item.text. Si j'utilise item.text_content(), je suis prêt à partir. Je ne suis pas sûr de savoir pourquoi. Tous les conseils seraient appréciésLors de l'analyse html, pourquoi ai-je besoin de item.text parfois et item.text_content() autres

D'accord, je ne sais pas exactement comment fournir un exemple sans vous faire gérer un fichier:

est un code ici je l'ai écrit pour essayer de comprendre pourquoi je ne reçois pas un texte que je prévu:

theTree=html.fromstring(open(notmatched[0]).read()) 
text=[] 
text_content=[] 
notText=[] 
hasText=[] 
for each in theTree.iter(): 
    if each.text: 
     text.append(each.text) 
     hasText.append(each) # list of elements that has text each.text is true 
    text_content.append(each.text_content()) #the text for all elements 
    if each not in hasText: 
     notText.append(each) 

donc, après avoir couru ce que je regarde

>>> len(notText) 
3612 
>>> notText[40] 
<Element b at 26ab650> 
>>> notText[40].text_content() 
'(I.R.S. Employer' 
>>> notText[40].text 
+0

Fournir quelques exemples vous aidera à répondre à votre question. –

Répondre

9

Accordng à the docs la méthode text_content:

Renvoie le contenu du texte de l'élément, y compris le contenu du texte de ses enfants, sans majoration.

Ainsi, par exemple,

import lxml.html as lh 
data = """<a><b><c>blah</c></b></a>""" 
doc = lh.fromstring(data) 
print(doc) 
# <Element a at b76eb83c> 

doc est le Elementa. La balise a n'a pas de texte qui la suit immédiatement (entre le <a> et le <b> Alors doc.text est None.

print(doc.text) 
# None 

mais il y a du texte après la balise c, donc doc.text_content() n'est pas None:

print(doc.text_content()) 
# blah 

PS Il y a une description claire de la signification de l'attribut texthere Bien que cela fasse partie des documents pour lxml.etree.Element, je pense que le sens des attributs text et tail s'applique également aux objets lxml.html.Element.

+0

.text ou .text_content() renvoyer la chaîne de texte, Comment puis-je obtenir le code source html au lieu de la chaîne de texte seulement? –

3

Vous confondant peut-être des interfaces différentes et incompatibles qui lxml im pléments - les lxml.etree éléments ont un attribut .text, alors que (par exemple) ceux de lxml.html implémenter la méthode text_content (et ceux de BeautifulSoup, également inclus dans lxml, ont un attribut .string ... parfois [[seulement noeuds avec un seul enfant qui est une chaîne ...]]).

Ouais, il est source de confusion en soi que lxml choisit à la fois pour mettre en œuvre ses propres interfaces et Emuler ou d'inclure d'autres bibliothèques, mais il peut être pratique ... ;-).

+0

J'ai fait quelques modifications J'ai utilisé l'interface lxml.html – PyNEwbie