экранирование символов в XML-файле с помощью Python - PullRequest
6 голосов
/ 11 февраля 2011

Мне нужно экранировать специальные символы в уродливом XML-файле (5000 строк или более).Вот пример XML, с которым мне приходится иметь дело:

<root>
 <element>
  <name>name & surname</name>
  <mail>name@name.org</mail>
 </element>
</root>

Здесь проблема заключается в символе «&» в имени.Как бы вы избежали специальных символов, как это с библиотекой Python?Я не нашел способ сделать это с BeautifulSoup .

Ответы [ 3 ]

8 голосов
/ 15 февраля 2011

Если вас не волнуют недопустимые символы в xml, вы можете использовать опцию синтаксического анализатора XML recover (см. Анализ разорванного XML с помощью lxml.etree.iterparse ):

from lxml import etree

parser = etree.XMLParser(recover=True) # recover from bad characters.
root = etree.fromstring(broken_xml, parser=parser)
print etree.tostring(root)

выход

<root>
<element>
<name>name  surname</name>
<mail>name@name.org</mail>
</element>
</root>
2 голосов
/ 14 февраля 2011

Вы, вероятно, просто хотите выполнить некоторое регулярное регулярное выражение для HTML, прежде чем выбросить его в BeautifulSoup.

Еще проще, если в коде нет сущностей SGML (&...;), html=html.replace('&','&amp;') добьется цели.

В противном случае попробуйте это:

x ="<html><h1>Fish & Chips & Gravy</h1><p>Fish &amp; Chips &#x0026; Gravy</p>"
import re
q=re.sub(r'&([^a-zA-Z#])',r'&amp;\1',x)
print q

По существу, регулярное выражение ищет &, за которым не следуют буквенно-цифровые или # символы.Он не будет иметь дело с амперсандами в конце строк, но это, вероятно, поправимо.

1 голос
/ 11 февраля 2011
<name>name & surname</name>

- это не правильно сформированный XML.Это должно быть:

<name>name &amp; surname</name>

Все соответствующие XML-инструменты должны создавать это - обычно вам не о чем беспокоиться.Если вы создадите строку с символом «&», то инструмент XML выведет экранированную версию.Если вы создаете строку вручную, вы обязаны убедиться, что она не экранирована.Если вы используете XML-редактор, он должен его избежать.

Если файл был передан вам кем-то другим, отправьте его обратно и скажите, что он не правильно сформирован.Если они больше не существуют, вам придется использовать простой текстовый редактор.Это хрупко и грязно, но другого пути нет.Если у файла есть амперсанды в других местах, которые используются для выхода, тогда файл является мусором.

См. 10-летний пост здесь и более поздний здесь .

...