从python中的line / Robust XML解析器中删除乱码

时间:2012-01-05 11:38:39

标签: python xml linux shell unix

我有一个包含损坏的XML的文件,在我想摆脱的行尾有一些垃圾字符。这些垃圾字符不允许我使用Python的XML解析器。例如:

<request><pair><name>q</name><value><![CDATA[LOL]]></value></pair><pair><name>start</name><value>1</value></pair></request>�J I�i�Y�Y��'z�3�u�J�5��}���#Q/k;!�ˑ�9Q){_������ŐF
<request><pair><name>q</name><value><![CDATA[LOL2]]></value></pair><pair><name>start</name><value>1</value></pair></request>4/lIT�l��'�c�Oֲ�{�;��_?��(>͏Y�mP��

如何在</request>之后删除垃圾字符?或者换句话说,如何删除</request><request>之间的字符串?

请注意<request></request>只有一行

代码:

awk '/<request>/ , /<\/request>/' test.txt

不起作用。

我的目的是在这种情况下,当名称为“q”(LOL和LOL2)时提取值。因此,如果可以轻松完成,我不会为删除垃圾字符而烦恼。

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

您可以使用lxml和xpath表达式提取数据 -

import lxml
from lxml import etree
source_xml = " path to your xml file"
et = etree.parse(source_xml)
value = et.xpath("//document/request/pair[name='q']/value/text()")
print " ".join(value) 

我使用您给定的xml示例尝试了此操作,输出为'LOL LOL2'

答案 1 :(得分:2)

这可行,但它可能不是最有效的方法:

>>> f = open('x.txt','r')
>>> z = ["%s</request>" % x.split('</request>')[0] for x in f.readlines()]

答案 2 :(得分:1)

这将返回文件,包括行分隔符,没有任何垃圾字符。 (注意:“with”语句适用于Python 2.6+,以前版本只需打开(),然后使用.close()文件)

import re
clean = ''
with open('x.txt','r') as f:
  clean = "".join([ line[:re.search('<\/request>',line).end()] for line in f ])