2010-08-31 4 views
1

J'utilise ElementTree et ne peux pas déterminer si le nœud enfant est du texte ou non. childelement.text ne semble pas fonctionner car il donne des faux positifs même sur des nœuds qui ne sont pas des nœuds de texte.Python ElementTree Vérifiez le type de nœud/élément

Des suggestions?

Exemple

<tr> 
    <td><a href="sdas3">something for link</a></td> 
    <td>tttttk</td> 
    <td><a href="tyty">tyt for link</a></td> 
</tr> 

Après l'analyse de ce fichier xml, je le fais en Python:

for elem_main in container_trs: #elem_main is each tr 
    elem0 = elem_main.getchildren()[0] #td[0] 
    elem1 = elem_main.getchildren()[1] #td[1] 

    elem0 = elem_main.getchildren()[0] 
    print elem0.text 

    elem1 = elem_main.getchildren()[1] 
    print elem1.text 

Le code ci-dessus ne sort pas elem0.text; c'est vide. Je vois le elem1.text (c'est-à tttttk) dans la sortie.

Update 2

Je construis en fait un dictionnaire. Le texte de l'élément avec chaque afin que je puisse trier la table HTML. Comment pourrais-je obtenir les s dans ce code?

+0

Pouvez-vous donner un exemple? –

+0

@Justin. S'il vous plaît vérifier l'exemple. –

+0

Vous m'avez confondu :). Veuillez reformuler les deux derniers paragraphes. – Rahul

Répondre

1

Comment l'utilisation de la méthode getiterator pour parcourir les tous les nœuds descendants:

import xml.etree.ElementTree as xee 

content=''' 
<tr> 
    <td><a href="sdas3">something for link</a></td> 
    <td>tttttk</td> 
    <td><a href="tyty">tyt for link</a></td> 
</tr> 
''' 

def text_content(node): 
    result=[] 
    for elem in node.getiterator(): 
     text=elem.text 
     if text and text.strip(): 
      result.append(text) 
    return result 

container_trs=xee.fromstring(content) 
adict={} 
for elem in container_trs: 
    adict[elem]=text_content(elem) 
print(adict) 
# {<Element td at b767e52c>: ['tttttk'], <Element td at b767e58c>: ['tyt for link'], <Element td at b767e36c>: ['something for link']} 

La boucle for elem_main in container_trs: parcourt les enfants de cantainer_trs.

En revanche, la boucle for elem_main in container_trs.getiterator(): iteraters par container_trs lui-même, et ses enfants, et petits-enfants, etc.

+0

Je suis en train de construire un dictionnaire. Le texte de l'élément avec chaque '' de sorte que je puisse trier la table HTML. Comment aurais-je les '' dans ce code? –

+0

@AJ: J'ai un peu changé le code pour montrer comment vous pourriez récupérer tout le texte sous chaque noeud 'td'. – unutbu

+0

Merci. Je vais le vérifier demain et vous le faire savoir. –

1

elem0.text est Aucun parce que le texte est en fait une partie de la <un> sous-élément. Il suffit d'aller un niveau plus profond:

print elem0.getchildren()[0].text 

Par ailleurs, elem0[0].text est un raccourci pour cette même construction - pas besoin de GetChildren().

+0

Je le sais. Je veux juste savoir comment vérifier si je dois aller plus loin d'un niveau? –

Questions connexes