用Python解析类XML时踩的坑
来源:互联网 发布:手机p正装照软件 编辑:程序博客网 时间:2024/05/21 13:59
最近在处理一份数据,初一看,这是xml格式,果断百度如何用Python解析xml,感觉甚是高大上。但是,细节决定成败啊,通过解析时遇到的bug发现,这数据竟不是标准的xml,原因有二:
1.tag的属性值应该用双引号引上,但是这份数据没有。举个栗子:
正确:<seg id="123">错误:<seg id=123>
这样在用xml.etree.ElementTree解析的时候是会报错的,会指出是‘’不好的格式‘’。
2.tag不封闭,举例就是只有<seg>
而没有</seg>
。
起初发现问题1的时候,我还天真的要修正这份数据,把tag的属性值的双引号补上,于是有了下面这段代码(顺便学了一点re)
'''这是部分重点代码,不完整'''import repattern1 = re.compile(r'<TEXT ID=(.+)>') #定义一个匹配模式with open(source_path,'r',encoding='utf-8') as old_file: with open(goal_path,'w',encoding='utf-8') as new_file: for line in old_file.readlines(): if pattern1.findall(line): res = pattern1.findall(line) #这里res就是没有引号的属性值 line = '<TEXT ID=\"'+ res[0] + '\">\n' new_file.write(line)
本以为到此双引号已经补上,就可以用xml.etree.ElementTree解析数据了,把标签中的数据提取出来,如此便大功告成。于是开心的写了下面的代码:
'''提取中TEXT标签之间的数据,删除数据之间的空白符和换行符,连成一句话,然后返回'''import xml.etree.ElementTree as ETimport retree = ET.parse(data_path)root = tree.getroot()del_space = re.compile('[ \t\n]*')sentences = []if root.iter('TEXT'): #找到TEXT标签,返回迭代器 for elem in root.iter('TEXT'): sent = del_space.sub('',elem.text) #作用是删除一段内容的空白符和换行符 sentences.append(sent)return sentences
对于格式良好的xml,上面的代码OK,但是如果tag不封闭,etree会报错。
至此,我决定放弃用解析xml的方法提取数据。那怎么办,返璞归真,直接上re,找规律,用re匹配。好吧,这也算是一个经验吧,高级的工具处理高级的问题,如果要解决的问题比较“粗糙”,那就用比较“鲁棒”的方法来解决。
阅读全文
0 0
- 用Python解析类XML时踩的坑
- python 的xml解析
- 初学者用python解析xml遇到的几个坑
- python对XML的解析
- python对XML的解析
- python对XML的解析
- python对XML的解析
- python对XML的解析
- python对XML的解析
- python对XML的解析
- Python解析XML的minidom
- 用python解析xml文件
- 用Python解析XML文件
- python之自动生成解析xml的C++类
- Python实现灵活的xml文件解析
- python对XML的解析总结
- python对XML的解析总结
- [转]python对XML的解析
- VMWare Player+Fedroa24 部署DPDK运行报错问题解决方法
- 导入SpringMVC项目报错
- 微信小程序跳转页面的几种方式???????
- Linux使用wake_up_interruptible()唤醒注册到等待队列上的进程
- GYM100814A(利用全排列函数)
- 用Python解析类XML时踩的坑
- 白话经典算法系列之五 归并排序的实现
- atom中的react 插件汇总
- HDU5326 work
- centos 7 防火墙操作的相关命令
- 2016 蓝桥杯 国赛 JAVA A组第四题 机器人塔
- java常量池概念(转)
- 初学opencv/滤波器
- nginx负载均衡