logo

Как в Python 3.1 расшифровать HTML-сущности в строке

Быстрый ответ

Для конвертации HTML-сущностей в обычные символы применяйте HTML-модуль Python с функцией unescape():

Python
Скопировать код
from html import unescape

print(unescape('This & that'))  # На экране: This & that

Наследственное расширение

В Python 3.1 существует класс HTMLParser, расположенный в модуле html.parser, который выполняет аналогичную задачу:

Python
Скопировать код
from html.parser import HTMLParser
parser = HTMLParser()
print(parser.unescape('This & that'))  # На экране: This & that

Функция HTMLParser().unescape() преобразует как стандартные сущности вроде &, так и более необычные, например, ".

Визуализация

Представьте себе HTML-сущности в строке в виде русских матрёшек (🪆) спрятанных в тексте:

Markdown
Скопировать код
Строка: "The <em>quick </em> brown fox"

Python действует как художник, создающий эти матрёшки:

Python
Скопировать код
import html
unescaped_string = html.unescape("The <em>quick </em> brown fox")

И вот нам представляется конечный результат:

Markdown
Скопировать код
Строка без экранирования: "The <em>quick </em> brown fox"

Теперь теги видны подобно открытым матрёшкам (🪆🔓)!

Альтернативные и полезные методы

Легендарный xml.sax.saxutils

Малоизвестный, но весьма эффективный xml.sax.saxutils также оснащён функцией unescape():

Python
Скопировать код
from xml.sax.saxutils import unescape

print(unescape('This &amp; that'))  # На экране: This & that

Этот метод подойдёт тем, кто предпочитает использовать исключительно встроенные инструменты Python.

Создай свой собственный инструмент с помощью регулярных выражений

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

Python
Скопировать код
import re
from html.entities import name2codepoint

def unescape_html(text):
    def substitute_entity(match):
        # "На каждую уловку найдётся свой отпор."
        entity = match.group(1)
        return chr(name2codepoint[entity])
    return re.sub(r'&(\w+);', substitute_entity, text)

print(unescape_html('The &lt;em&gt;quick&lt;/em&gt; brown &amp; fox'))  # На экране: The <em>quick</em> brown & fox

В данном случае регулярное выражение распознаёт сущности и заменяет их соответствующими символами Unicode.

Экранирование Unicode и шестнадцатеричных подстановок: несложная задача для специалистов!

Даже сложно экранированные unicode-символы не останутся в тени:

Python
Скопировать код
escaped_str = "The quick brown fox \\u003Cem\\u003Ejumps\\u003C/em\\u003E over the lazy dog"
print(bytes(escaped_str, "ascii").decode("unicode_escape"))

Точно так же и с символами, обозначенными в шестнадцатеричной форме:

Python
Скопировать код
print(bytes.fromhex('54686520717569636b2062726f776e').decode('utf-8'))

Полезные материалы

  1. 19.1. html.parser — Простой HTML- и XHTML-парсер — документация Python 3.1 на тему парсинга HTML.
  2. Декодировать HTML-сущности в строке Python'а? — обсуждение на StackOverflow, содержащее множество полезных советов.
  3. HTML Символьные Сущности — углубленный справочник HTML-сущностей от W3Schools.
  4. Документация по Beautiful Soup — информация о альтернативных парсерах HTML/XML.
  5. Beautiful Soup: Введение в создание скрапера для веба на Python — руководство по применению Beautiful Soup для HTML-парсинга.
  6. Сущность — статья на MDN Web Docs, которая поможет вам лучше понять принцип работы с HTML-сущностями.
  7. Шифрование и дешифрование текста в его HTML-эквивалент — онлайн-инструмент для шифрования и дешифрования HTML-сущностей.