用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匹配。好吧,这也算是一个经验吧,高级的工具处理高级的问题,如果要解决的问题比较“粗糙”,那就用比较“鲁棒”的方法来解决。

原创粉丝点击