python处理类xml文件遇到的坑

首先先确定xml文件有两个特点容易忽视,
1、xml文件有且只有一个根节点
2、xml文件的标签的属性都有引号“”
这里写图片描述
由于对xml文件不熟,并且对python处理xml文件不熟,故这两个坑用了将近一天的时间来填,谨记

说到填坑,要特备感谢一驻马店的老乡“驻马店bd”qq已备注。不是他的帮助,估计还要整好长时间。特此感谢,虽然他看不到。

那么我处理的文件到底什么样子呢,请看图:
这里写图片描述

就这这么个德行,一缺少根节点(在文件开头结尾补上即可),二标签的属性缺少引号(使用正则表达式在id=x加上引号就行了id=”x”)。

(自强不息)

——————————————————————————————————————————————
2017.02.19记录
记得有点乱哈。
这次总结下,我之所以要一直使之成为合法的xml文件,是因为我要提取xml文件里面的属性。可能转的圈有点大。但是目前我也没什么好的办法。先按着这个方法来呗。
要想成为一个合法的xml文件,除了满足上面的两点,还有一点也要满足

即属性里不能有特殊的字符(如<>、&、()等等不知道的字符)。有的话,就没办法当成一个xml文件进行解析。所以要去掉这些字符。这里我选择使用正则表达式去匹配去除。

下面贴出两个解析正常xml(读取xml)文件的代码:
先来两个参考链接:
http://www.runoob.com/python/python-reg-expressions.html
http://www.cnblogs.com/linyawen/archive/2012/03/28/2420649.html

——————————————————————————————————————
以下是2017.02.20记录
经历过这近三天的经历,我突然意识到也许作者在写这个文件时,就不是按照xml格式来写的,导致按照xml文件格式来处理千难万难。这样的判断来自以下两点:
1、加入是合法的xml文件,那么这个标签的属性里面就不会包含尖括号<>等这样的非法字符。
2、按照xml文件来处理,这样的非法字符很多。
综上所述,这个文件不能按照xml文件来处理。

今天突然灵感一来,我决定直接提取我想要的标签属性:
代码是re+++.py

这个代码实现了从类xml文件中(如上图格式)提取出标签属性。
代码上传至(待定)

# -*- coding: utf-8 -*-
#
# Copyright @2017 R&D, CINS Inc. (cins.com)
#
# Author: PengjunZhu <1512568691@qq.com>
#a5a
# Function:提取出原始文件中的sunmary和short_text,将每一个human_label、summary和short_text分词后写在一行
#
# time: 2017.02.20
# 提取 line中的xx
# result0 = re.findall("XX",line)  # 这里的XX代表你要提取的某种格式的符号
# print result0[0]                 # 将提出出来的xx写到屏幕上
#
import re
import jieba.posseg as pseg
import jieba

path1 = 'D:/LCSTS/DATA/PART_I.txt'
path2 = 'D:/LCSTS/DATA1/PART_I_comb.txt'

file1 = open(path1, 'r')
file2 = open(path2, 'w')
# file2.write('<ddoc>'+'\n')
i = 0
print '程序开始'
print '程序运行中...'
for line in file1:

    if '</short_text>' in line:  #一个文本换一行
        # print 'true'
        file2.write('\n')

    if '<doc id=' in line:
        id = re.findall("\d+",line)
        # print '文本id是:',id[0]
        # file2.write(id[0]+"##")

    if '<human_label>' in line:
        score = re.findall("\d+",line)
        # print '人工打标签的分值:',score[0]
        file2.write(score[0]+" ")

    regex = re.compile(u'[\u4e00-\u9fa5]')     #匹配有中文字符的行
    match = regex.search(line.decode('utf-8'))  #match是一个布尔值,1代表匹配到了。0代表没有

    if match:
        line1 = re.sub("<.*?>","",line)
        line1 = line1.strip()
        line2 = line1.decode('utf-8', 'ignore') #将获取的字符串line1做decode时,指明ignore,会忽略非法字符,这样就可以了

        words = jieba.cut(line2)      # 分词
        line2 = " ".join(words).encode('utf-8')

        # print line2
        i += 1
        # words = pseg.cut(line1)     # 分词+词性标注
        # for word, flag in words:
        #     print word +'/'+ flag
        file2.write(line2+" ")
    else:
        pass
print i
file1.close()
# file2.write('</ddoc>'+'\n')
file2.close()
print '程序结束'
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值