2012-01-05 37 views
0

我有一个文件,其中包含损坏的XML,在我想摆脱的行尾有一些垃圾字符。这些垃圾字符不允许我使用Python的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)的情况下提取值。因此,如果这可以轻松完成,我不会为删除垃圾角色而烦恼。

谢谢你的时间。

+0

为什么不是乱码解析XML先筛选? – 2012-01-05 11:42:18

+0

如何过滤?我无法更改打印此XML的模块。所以我拥有的是一个带有垃圾字符的文件。 – 2012-01-05 11:43:44

回答

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'

+0

[etree lxml教程](http://lxml.de/tutorial.html) – RanRag 2012-01-05 12:22:04

+0

我终于设法安装了lxml,但在“etree.parse”行中出现错误? (文件内容与示例中相同)。请帮忙。非常新的Python转换。 – 2012-01-05 12:32:17

+1

好的,尝试这样做 - 在文件的开头添加''标签,而不是在文件末尾添加''标签。可能是这可以帮助 – RanRag 2012-01-05 12:34:09

2

这工作,但它可能不是最有效的方法要做到这一点:

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

这会让你回来的文件,包括行分隔符,没有任何垃圾字符。 (注:“同向”的语句就是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 ]) 
+0

正则表达式FTW !,谢谢 – 2012-01-05 12:32:52