我试图解析一个xml文件。 我的问题与此相同:
parsing an xml file for unknown elements using python ElementTree
我尝试了untubu的解决方案。
效果很好。但仅适用于具有单个标签的行
例如:
<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>
'''
它失败了.. 我有很多像这样的例子。 我不想超越本机库的使用,因为在此之后我将在不同的计算机上运行代码(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)
异常追踪:
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
答案 0 :(得分:2)
TagParser
使用endElement
将数据添加到self.tags
。
src
等于
src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link></review>
'''
<review>
没有结束标记</review>
,因此永远不会调用endElement
。
如果您向</review>
添加结束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'}
答案 1 :(得分:1)
尽管你的问题是:
,但这实际上运作得很好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)
parser.tags
最终为:
{u'tag...': u'42', u'tag_x': u'bubbles', u'tag_y': u'car'}
您的其他示例确实失败了,但仅仅因为它不是有效的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)
review
标记永远不会在源中关闭,因此这不是有效的XML片段,因此当您尝试解析它时会引发异常。
如果您的问题是您从有效文件中取出不完整的片段,请不要这样做;获取整个review
标记并解析它,而不是尝试解析其中的一行。
如果您的问题是源数据实际上不是有效的XML,则需要使用旨在处理损坏的XML的解析器,例如BeautifulSoup; <{1}}和ElementTree
都不起作用。