2010-06-02 6 views
1

J'essaie de convertir un document XHTML qui utilise beaucoup de tables dans un document XML sémantique en Python en utilisant xml.etree. Cependant, je vais avoir des problèmes de conversion de cette XHTMLAnalyser le texte de l'élément avec l'élément vide à l'intérieur

<TD> 
    Textline1<BR/> 
    Textline2<BR/> 
    Textline3 
</TD> 

dans quelque chose comme ça

<lines> 
    <line>Textline1</line> 
    <line>Textline2</line> 
    <line>Textline3</line> 
</lines> 

Le problème est que je ne sais pas comment obtenir le texte après les éléments BR.

Répondre

1

Vous devez utiliser la propriété .tail des <br> éléments.

import xml.etree.ElementTree as et 

doc = """<TD> 
    Textline1<BR/> 
    Textline2<BR/> 
    Textline3 
</TD> 
""" 

e = et.fromstring(doc) 

items = [] 
for x in e.getiterator(): 
    if x.text is not None: 
     items.append(x.text.strip()) 
    if x.tail is not None: 
     items.append(x.tail.strip()) 

doc2 = et.Element("lines") 
for i in items: 
    l=et.SubElement(doc2, "line") 
    l.text = i 

print(et.tostring(doc2)) 
+0

AARRGGHH utilisent 'si foo est None:' 'pas si foo = none' –

+0

Bien sûr, vous avez raison John, je le ferais normalement!. Je viens de passer les 9 dernières heures à coder Java alors j'ai glissé :( – EnigmaCurry

+1

Vous devez avoir commis une infraction vraiment sérieuse pour mériter une phrase telle que 9 heures de codage Java. –

0

Je ne pense pas que les étiquettes soient vides. xml.etree ne peut pas s'attendre à ce que vous ayez des éléments enfants et des nœuds de texte nu mélangés.

BeautifulSoup est idéal pour analyse XML ou HTML qui ne sont pas bien formaté:

import BeautifulSoup 
soup = BeautifulSoup.BeautifulSoup(open('in.html').read()) 
print "\n".join(["<line>%s</line>" % node.strip() for node in soup.find('td').contents if isinstance(node, BeautifulSoup.NavigableString)]) 
Questions connexes