Удаление мусорных символов из строки / Надежный анализатор XML в python - PullRequest
0 голосов
/ 05 января 2012

У меня есть файл, который содержит поврежденный 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

не работает.

Моя цель состоит в том, чтобы извлечь значение, когда name равно «q» (LOL и LOL2) в этом случае. Так что, если это можно сделать легко, меня не беспокоит удаление ненужных символов.

Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

вы можете извлекать данные, используя выражения 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'

2 голосов
/ 05 января 2012

Это работает, но, вероятно, это не самый эффективный способ сделать это:

>>> f = open('x.txt','r')
>>> z = ["%s</request>" % x.split('</request>')[0] for x in f.readlines()]
1 голос
/ 05 января 2012

Это вернет вам файл, включая разделители строк, без каких-либо символов мусора. (примечание: оператор «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 ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...