Шаг 39.
Python: сборник рецептов.
Строки и текст. Работа с HTML- и XML-сущностями в тексте

    На этом шаге мы рассмотрим примеры использования соотвествующих парсеров.

Задача

    Вы хотите заменить HTML- и XML-сущности, такие как &entity; или &#code;, соответствующим текстом. Или же вам нужно произвести текст, но экранировать некоторые символы (например, <, > или &).

Решение

    Если вы производите текст, довольно просто заменить спецсимволы типа < или > с помощью функции html.escape(). Например:

>>> s = 'Elements are written as "<tag>text</tag>".'
>>> import html
>>> print(s)
Elements are written as "<tag>text</tag>".
>>> print(html.escape(s))
Elements are written as &quot;&lt;tag&gt;text&lt;/tag&gt;&quot;.
>>> # Отключим экранирование кавычек
>>> print(html.escape(s, quote=False))
Elements are written as "&lt;tag&gt;text&lt;/tag&gt;".
>>> 

    Если вы хотите произвести текст в кодировке ASCII и вставить коды символов вместо отсутствующих в ASCII символов, вы можете использовать аргумент errors='xmlcharrefreplace' с различными функциями ввода-вывода. Например:

>>> s = 'Spicy Jalapeño'
>>> s.encode('ascii', errors='xmlcharrefreplace')
b'Spicy Jalape&#241;o'
>>> 

    Чтобы заменить сущности в тексте, нужен другой подход. Если вы обрабатываете HTML или XML, попробуйте для начала настоящий парсер HTML или XML. Обычно эти инструменты автоматически позаботятся о замене значений во время парсинга, и вам не придется об этом беспокоиться.

    Если же по каким-то причинам вы получили голый текст с включением сущностей, и вы хотите заменить их вручную, то сможете сделать это с помощью различных функций и методов, связанных с парсерами HTML и XML. Например:

>>> s = 'Spicy "Jalapeño".'
>>> from html.parser import HTMLParser
>>> p = HTMLParser()
>>> p.unescape(s)
'Spicy "Jalapeño".'
>>> 
>>> t = 'The prompt is >>>'
>>> from xml.sax.saxutils import unescape
>>> unescape(t)
''The prompt is >>>'
>>> 


Обсуждение

    О правильном экранировании спецсимволов при генерировании HTML или XML легко забыть. Это особенно верно, если вы генерируете вывод самостоятельно, используя print() или другую базовую функцию форматирования строк. Есть простое решение - использовать функцию типа htmlescape().

    Если вам нужно произвести обратное преобразование текста, к вашим услугам различные функции типа xml.sax.saxutils.unescape(). Однако мы все же рекомендуем использовать парсер. Например, если при обработке HTML и XML использовать такие парсеры, как html.parser или xml.etree.ElementTree, то они самостоятельно позаботятся о замене сущностей в тексте.

    На следующем шаге мы рассмотрим токенизацию текста.




Предыдущий шаг Содержание Следующий шаг