开发者

Parse xml file while a tag is missing

开发者 https://www.devze.com 2022-12-15 12:21 出处:网络
I try to parse an xml file. The text which is in tags is parsed successfully (or it开发者_如何学运维 seems so) but I want to output as the text which is not contained in some tags and the following pr

I try to parse an xml file. The text which is in tags is parsed successfully (or it开发者_如何学运维 seems so) but I want to output as the text which is not contained in some tags and the following program just ignores it.

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()

A part of the input I want to parse: <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>


Have a look at BeautifulSoup, a python library for parsing, navigating and manipulating html and xml. It has a handy interface and might solve your problem ...


Here's a pyparsing version - I hope the comments are sufficiently explanatory.

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)

Gives

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}) ) }.
0

精彩评论

暂无评论...
验证码 换一张
取 消