在Python中移除行中的垃圾字符/强大的XML解析器

1 投票
3 回答
1857 浏览
提问于 2025-04-17 09:35

我有一个文件,里面的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'

撰写回答