首页 新闻 会员 周边

初学Python求助Python解析xml

0
悬赏园豆:15 [已解决问题] 解决于 2015-07-07 17:48

从网上找了一些实例,测试了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>
酷小孩的主页 酷小孩 | 菜鸟二级 | 园豆:243
提问于:2015-07-07 12:28
< >
分享
最佳答案
0

你把转义符拿掉就好了。

请叫我红领巾

收获园豆:15
Pan~ | 菜鸟二级 |园豆:217 | 2015-07-07 17:07

红领巾你好,红领巾再见。

酷小孩 | 园豆:243 (菜鸟二级) | 2015-07-07 17:08
其他回答(1)
0

又继续研究了一下,现在搞定了,说方法:

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)

 

 

 

 

 

 

酷小孩 | 园豆:243 (菜鸟二级) | 2015-07-07 17:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册