Python 解析未知的标记xml文件

Python 解析未知的标记xml文件,python,sax,Python,Sax,我试图解析一个xml文件。 我的问题与此相同: 我尝试了解套的方法 它工作得很好。但仅适用于具有单个标记的行 例如: <some_root_name> <tag_x>bubbles</tag_x> </some_root_name> 泡沫 这很有效 但如果是这样的话: src = '''\ <review type="review"><link>http://www.openlist.com/new-york

我试图解析一个xml文件。 我的问题与此相同:

我尝试了解套的方法

它工作得很好。但仅适用于具有单个标记的行

例如:

   <some_root_name>
<tag_x>bubbles</tag_x>
 </some_root_name>

泡沫
这很有效 但如果是这样的话:

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link>
'''
src=''\
http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178
'''
它失败了。。 我有很多这样的例子。 我不想超出本机库的使用范围,因为在此之后,我将在不同的计算机(prod env)上运行代码,并且必须在那里设置库。。而且会变得一团糟

有没有办法,我可以修改原来的解决方案来解决这个问题。 谢谢

上面链接中的代码:

import xml.sax as sax
import xml.sax.handler as saxhandler
import pprint

class TagParser(saxhandler.ContentHandler):
    # http://docs.python.org/library/xml.sax.handler.html#contenthandler-objects
    def __init__(self):
        self.tags = {}
    def startElement(self, name, attrs):
        self.tag = name
    def endElement(self, name):
        if self.tag:
            self.tags[self.tag] = self.data
            self.tag = None
            self.data = None
    def characters(self, content):
        self.data = content

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)
将xml.sax导入为sax
将xml.sax.handler作为saxhandler导入
导入pprint
类TagParser(saxhandler.ContentHandler):
# http://docs.python.org/library/xml.sax.handler.html#contenthandler-物体
定义初始化(自):
self.tags={}
def startElement(自身、名称、属性):
self.tag=名称
定义元素(自身、名称):
如果self.tag:
self.tags[self.tag]=self.data
self.tag=None
self.data=None
def字符(自身、内容):
self.data=内容
parser=TagParser()
src=''\
泡沫
汽车
42
'''
parseString(src,解析器)
pprint.pprint(parser.tags)
异常跟踪:

File "extract_xml.py", line 59, in unittest
  sax.parseString(src, parser)
File "C:\Python27\lib\xml\sax\__init__.py", line 49, in parseString
  parser.parse(inpsrc)
File "C:\Python27\lib\xml\sax\expatreader.py", line 107, in parse
  xmlreader.IncrementalParser.parse(self, source)
File "C:\Python27\lib\xml\sax\xmlreader.py", line 125, in parse
  self.close()
File "C:\Python27\lib\xml\sax\expatreader.py", line 217, in close
  self.feed("", isFinal = 1)
File "C:\Python27\lib\xml\sax\expatreader.py", line 211, in feed
  self._err_handler.fatalError(exc)
File "C:\Python27\lib\xml\sax\handler.py", line 38, in fatalError
  raise exception
xml.sax._exceptions.SAXParseException: <unknown>:2:4: no element found
unittest中第59行的文件“extract_xml.py” parseString(src,解析器) 文件“C:\Python27\lib\xml\sax\\ uuuuu init\ uuuuuuu.py”,第49行,格式为parseString parser.parse(inpsrc) 文件“C:\Python27\lib\xml\sax\expatreader.py”,第107行,在parse中 IncrementalParser.parse(self,source) 文件“C:\Python27\lib\xml\sax\xmlreader.py”,第125行,在parse中 self.close() 文件“C:\Python27\lib\xml\sax\expatreader.py”,第217行,关闭 self.feed(“”,isFinal=1) 文件“C:\Python27\lib\xml\sax\expatreader.py”,第211行,在提要中 self.\u err\u handler.fatalError(exc) 文件“C:\Python27\lib\xml\sax\handler.py”,第38行,在fatalError中 引发异常 xml.sax._exceptions.SAXParseException::2:4:未找到元素
标签解析器
使用
endElement
self.tags
添加数据

src
等于

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link></review>
'''
然后,该计划产生了收益

{u'link': u'http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178'}

TagParser
使用
endElement
self.tags
添加数据

src
等于

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link></review>
'''
然后,该计划产生了收益

{u'link': u'http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178'}

不管你的问题是什么,这实际上效果很好:

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)
您的另一个示例确实失败了,但这只是因为它不是有效的XML:

src = '''<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link>'''
parser = TagParser()
sax.parseString(src, parser)
pprint.pprint(parser.tags)
src=''http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178'''
parser=TagParser()
parseString(src,解析器)
pprint.pprint(parser.tags)
review
标记在源代码中从未关闭,因此这不是有效的XML片段,因此在尝试解析它时会引发异常

如果您的问题是从有效文档中取出不完整的片段,请不要这样做;把整个
review
标记拿出来进行解析,而不是试图解析其中的一行


如果您的问题是源数据实际上不是有效的XML,那么您需要使用一个专门用于处理损坏的XML的解析器,如;无论是
ElementTree
还是
xml.sax
都不起作用。

不管您的问题是什么,这实际上效果很好:

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)
您的另一个示例确实失败了,但这只是因为它不是有效的XML:

src = '''<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link>'''
parser = TagParser()
sax.parseString(src, parser)
pprint.pprint(parser.tags)
src=''http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178'''
parser=TagParser()
parseString(src,解析器)
pprint.pprint(parser.tags)
review
标记在源代码中从未关闭,因此这不是有效的XML片段,因此在尝试解析它时会引发异常

如果您的问题是从有效文档中取出不完整的片段,请不要这样做;把整个
review
标记拿出来进行解析,而不是试图解析其中的一行


如果您的问题是源数据实际上不是有效的XML,那么您需要使用一个专门用于处理损坏的XML的解析器,如;
ElementTree
xml.sax
都不起作用。

你说的“它失败”是什么意思?有错误消息吗?@GrzegorzOledzki:已编辑。thanksI在Python2.7.2中运行了您的精确代码,我得到了
{u'tag…':u'42',u'tag_x':u'bubbles',u'tag_uy':u'car'}
。同时,您的问题描述说,当标记在单独的行上时,它可以工作,但当它们都在同一行上时,它会失败……然后,当标记在单独的行上时,您的示例代码显示它失败。是哪一个?@Fraz:你在回复之前读过我的评论吗?“它使用
lxml.etree.ElementTree
而不是内置的
xml.etree.ElementTree
xml.etree.celementree
,但这实际上是一个1个字符的更改。”你说的“它失败”是什么意思?有错误消息吗?@GrzegorzOledzki:已编辑。thanksI在Python2.7.2中运行了您的精确代码,我得到了
{u'tag…':u'42',u'tag_x':u'bubbles',u'tag_uy':u'car'}
。同时,您的问题描述说,当标记在单独的行上时,它可以工作,但当它们都在同一行上时,它会失败……然后,当标记在单独的行上时,您的示例代码显示它失败。是哪一个?@Fraz:你在回复之前读过我的评论吗?“它使用
lxml.etree.ElementTree
而不是内置的
xml.etree.ElementTree
xml.etree.celementree
,但这实际上是一个单字符的更改。”