2010-01-02 8 views
0

J'essaye d'analyser un fichier xml. Le texte qui est dans les balises est analysé avec succès (ou il semble que oui) mais je veux sortir comme le texte qui n'est pas contenu dans quelques étiquettes et le programme suivant l'ignore juste.Analyser un fichier XML alors qu'une balise est manquante

from xml.etree.ElementTree import XMLTreeBuilder 

class HtmlLatex:      # The target object of the parser 
    out = '' 
    var = '' 
    def start(self, tag, attrib): # Called for each opening tag. 
     pass 
    def end(self, tag):    # Called for each closing tag. 
     if tag == 'i': 
      self.out += self.var 
     elif tag == 'sub': 
      self.out += '_{' + self.var + '}' 
     elif tag == 'sup': 
      self.out += '^{' + self.var + '}' 
     else: 
      self.out += self.var 
    def data(self, data): 
     self.var = data 
    def close(self): 
     print(self.out) 


if __name__ == '__main__': 
    target = HtmlLatex() 
    parser = XMLTreeBuilder(target=target) 

    text = '' 
    with open('input.txt') as f1: 
     text = f1.read() 

    print(text) 

    parser.feed(text) 
    parser.close() 

Une partie de l'entrée que je veux analyser: <p><i>p</i><sub>0</sub> = (<i>m</i><sup>3</sup>+(2<i>l</i><sub>2</sub>+<i>l</i><sub>1</sub>) <i>m</i><sup>2</sup>+(<i>l</i><sub>2</sub><sup>2</sup>+2<i>l</i><sub>1</sub> <i>l</i><sub>2</sub>+<i>l</i><sub>1</sub><sup>2</sup>) <i>m</i>) /(<i>m</i><sup>3</sup>+(3<i>l</i><sub>2</sub>+2<i>l</i><sub>1</sub>)) }.</p>

+1

C'est pas comme xml j'ai jamais vu. Bien sûr, vous ne voulez pas un analyseur _html_? – James

+0

C'est produit ici: http://wims.unice.fr/wims/en_tool~linear~linsolver.fr.html Lorsque vous obtenez la solution, si vous regardez la source, vous voyez quelque chose de similaire. –

+1

Vous venez d'éditer le tag LaTeX. ??? –

Répondre

2

Voici une version pyparsing - j'espère que les commentaires sont suffisamment explicatifs.

src = """<p><i>p</i><sub>0</sub> = (<i>m</i><sup>3</sup>+(2<i>l</i><sub>2</sub>+<i>l</i><sub>1</sub>) """ \ 
     """<i>m</i><sup>2</sup>+(<i>l</i><sub>2</sub><sup>2</sup>+2<i>l</i><sub>1</sub> <i>l</i><sub>2</sub>+""" \ 
     """<i>l</i><sub>1</sub><sup>2</sup>) <i>m</i>) /(<i>m</i><sup>3</sup>+(3<i>l</i><sub>2</sub>+""" \ 
     """2<i>l</i><sub>1</sub>)) }.</p>""" 

from pyparsing import makeHTMLTags, anyOpenTag, anyCloseTag, Suppress, replaceWith 

# set up tag matching for <sub> and <sup> tags 
SUB,endSUB = makeHTMLTags("sub") 
SUP,endSUP = makeHTMLTags("sup") 

# all other tags will be suppressed from the output 
ANY,endANY = map(Suppress,(anyOpenTag,anyCloseTag)) 

SUB.setParseAction(replaceWith("_{")) 
SUP.setParseAction(replaceWith("^{")) 
endSUB.setParseAction(replaceWith("}")) 
endSUP.setParseAction(replaceWith("}")) 

transformer = (SUB | endSUB | SUP | endSUP | ANY | endANY) 

# now use the transformer to apply these transforms to the input string 
print transformer.transformString(src) 

Donne

p_{0} = (m^{3}+(2l_{2}+l_{1}) m^{2}+(l_{2}^{2}+2l_{1} l_{2}+l_{1}^{2}) m) /(m^{3}+(3l_{2}+2l_{1})) }. 
3

Jetez un oeil à BeautifulSoup, une bibliothèque Python pour l'analyse, la navigation et la manipulation html et xml. Il a une interface pratique et pourrait résoudre votre problème ...

+0

Merci pour la suggestion. Je vais y jeter un coup d'oeil. –