从网上找了一些实例,测试了ElementTree 和lxml, 均报错。报错如:
lxml.etree.XMLSyntaxError: StartTag: invalid element name, line 1, column 57
运行环境是Ubuntu+Python2.7.9
求助一下谁做过类似的,能帮忙提供点思路。示例xml如下:
<?xml version="1.0" encoding="gbk"?> <DOCUMENT> <docid><\/docid> <item> <key><![CDATA[http://mp.weixin.qq.com/]]><\/key> <tplid><![CDATA[555]]><\/tplid> <classid>11002601<\/classid> <display> <docid>ab735a258a90e8e1-6bee54fcbd896b2a-8c82e2f07788c64c8058f2fe99ccad5b<\/docid> <tplid>550<\/tplid> <title><![CDATA[MacTalk 在 WWDC 现场]]><\/title> <url><![CDATA[http://mp.weixin.qq.com/s?__biz=MjM5ODQ2MDIyMA==&mid=206967790&idx=2&sn=8bd0024ecb4552f6327a49856bf8ec35&3rd=MzA3MDU4NTYzMw==&scene=6#rd]]><\/url> <title1><![CDATA[MacTalk 在 WWDC 现场]]><\/title1> <imglink><![CDATA[http://mmbiz.qpic.cn/mmbiz/JuJRyjO2zcYia2615bicFgDBGDmeWrg6ecbnRcekbADsZDLrzoe3tWkSichuK3XqHBBia1njYPVlq4MD2yoRLnoqNg/0?wx_fmt=jpeg]]><\/imglink> <headimage><![CDATA[http://wx.qlogo.cn/mmhead/Q3auHgzwzM4dHfT9d3ogQk5E08iadsdsGT8KeRuXQhiaISuoUJeXIXbw/0]]><\/headimage> <sourcename><![CDATA[MacTalk]]><\/sourcename> <content168><![CDATA[这篇文章的大部分文字和素材都是由在 WWDC 现场的朋友韦冠男提供的,我用 MacTalk 的语言风格做了小幅调整之后,热热乎乎奉献给大家,至于 OS X、iOS 和 Swift,我最喜欢的部分是软件的分屏操作和编程语言的开源.今天忙了一天,还没来得及看 WWDC 的视频,只能以后再讲了.以...]]><\/content168> <site><![CDATA[http://www.lagou.com/?utm_source=AD__cjq&utm_medium=article&utm_campaign=toufang]]><\/site> <isV><![CDATA[1]]><\/isV> <openid><![CDATA[oIWsFt98u7kmyb9-OpSPghHa7Uiw]]><\/openid> <content><![CDATA[这篇文章的大部分文字和素材都是由在 WWDC 现场的朋友韦冠男提供的,我用 MacTalk 的语言风格做了小幅调整之后,热热乎乎奉献...]]><\/content> <showurl><![CDATA[微信 - mp.weixin.qq.com]]><\/showurl> <date><![CDATA[2015-6-9]]><\/date> <pagesize><![CDATA[42k]]><\/pagesize> <lastModified>1433855159<\/lastModified> <pagesize>43k<\/pagesize> <\/display> <\/item> <\/DOCUMENT>
你把转义符拿掉就好了。
请叫我红领巾
红领巾你好,红领巾再见。
又继续研究了一下,现在搞定了,说方法:
1. 我上面这段xml代码,一开始没有注意看,在每一个元素的结尾元素中都含有转义符,这就是为什么我用xml解析插件时一直保报错的原因,因为他不是正规的xml格式。我的方法是用正则替换掉:re.sub(r'(<)\\(/.+?>)',r'\g<1>\g<2>',f_xml) 对于Python中的正则re的sub用法,可以看这里:http://mushanblog.com/blog/python-re-module-quickstart
2. 处理成正规的xml格式后,我这里还是用ElementTree来解析的,但在加载时又报错:
cElementTree.ParseError: XML or text declaration not at start of entity: line 2, column 0
这个错误我在网上没有找到合适的答案,不过根据字面意思来解决,就是在开头的地方有错误。这里我尝试这吧xml的文档声明给去掉了,居然没有报错。这里有些不理解为什么不能加? 我的方法:f_xml=test_xml.replace('<?xml version="1.0" encoding="gbk"?>','')
3. 然后再加载,就能获取到相应的节点了。
主要代码如下:
f_xml=test_xml.replace('<?xml version="1.0" encoding="gbk"?>','') mat=re.sub(r'(<)\\(/.+?>)',r'\g<1>\g<2>',f_xml) xml_root_doc=ET.fromstring(f_xml) print(xml_root_doc)