在Python中移除行中的垃圾字符/强大的XML解析器
我有一个文件,里面的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 个回答
1
这样做会返回文件内容,包括换行符,而且不会有任何多余的字符。
(注意:“with”语句适用于Python 2.6及以上版本,如果你用的是更早的版本,只需要用open()打开文件,然后用.close()关闭文件就可以了)
import re
clean = ''
with open('x.txt','r') as f:
clean = "".join([ line[:re.search('<\/request>',line).end()] for line in f ])
2
这个方法可以用,但可能不是最有效的做法:
>>> f = open('x.txt','r')
>>> z = ["%s</request>" % x.split('</request>')[0] for x in f.readlines()]
4
你可以使用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'