экранирование символов в xml-файле с помощью python

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

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

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

3 ответов


Если вас не волнуют недопустимые символы в xml, вы можете использовать синтаксический анализатор XML (см. разбор сломанного 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>

вы, вероятно, просто хотите сделать некоторые простые regexp-ery на 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;',x)
print q

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


<name>name & surname</name>

не является хорошо сформированным XML. Должно быть:

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

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

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

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