2012-01-05 16 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