Как в Python 3.1 расшифровать HTML-сущности в строке
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для конвертации HTML-сущностей в обычные символы применяйте HTML-модуль Python с функцией unescape()
:
from html import unescape
print(unescape('This & that')) # На экране: This & that
Наследственное расширение
В Python 3.1 существует класс HTMLParser
, расположенный в модуле html.parser
, который выполняет аналогичную задачу:
from html.parser import HTMLParser
parser = HTMLParser()
print(parser.unescape('This & that')) # На экране: This & that
Функция HTMLParser().unescape()
преобразует как стандартные сущности вроде &
, так и более необычные, например, "
.
Визуализация
Представьте себе HTML-сущности в строке в виде русских матрёшек (🪆) спрятанных в тексте:
Строка: "The <em>quick </em> brown fox"
Python действует как художник, создающий эти матрёшки:
import html
unescaped_string = html.unescape("The <em>quick </em> brown fox")
И вот нам представляется конечный результат:
Строка без экранирования: "The <em>quick </em> brown fox"
Теперь теги видны подобно открытым матрёшкам (🪆🔓)!
Альтернативные и полезные методы
Легендарный xml.sax.saxutils
Малоизвестный, но весьма эффективный xml.sax.saxutils
также оснащён функцией unescape()
:
from xml.sax.saxutils import unescape
print(unescape('This & that')) # На экране: This & that
Этот метод подойдёт тем, кто предпочитает использовать исключительно встроенные инструменты 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 <em>quick</em> brown & fox')) # На экране: The <em>quick</em> brown & fox
В данном случае регулярное выражение распознаёт сущности и заменяет их соответствующими символами Unicode.
Экранирование Unicode и шестнадцатеричных подстановок: несложная задача для специалистов!
Даже сложно экранированные unicode-символы не останутся в тени:
escaped_str = "The quick brown fox \\u003Cem\\u003Ejumps\\u003C/em\\u003E over the lazy dog"
print(bytes(escaped_str, "ascii").decode("unicode_escape"))
Точно так же и с символами, обозначенными в шестнадцатеричной форме:
print(bytes.fromhex('54686520717569636b2062726f776e').decode('utf-8'))
Полезные материалы
- 19.1. html.parser — Простой HTML- и XHTML-парсер — документация Python 3.1 на тему парсинга HTML.
- Декодировать HTML-сущности в строке Python'а? — обсуждение на StackOverflow, содержащее множество полезных советов.
- HTML Символьные Сущности — углубленный справочник HTML-сущностей от W3Schools.
- Документация по Beautiful Soup — информация о альтернативных парсерах HTML/XML.
- Beautiful Soup: Введение в создание скрапера для веба на Python — руководство по применению Beautiful Soup для HTML-парсинга.
- Сущность — статья на MDN Web Docs, которая поможет вам лучше понять принцип работы с HTML-сущностями.
- Шифрование и дешифрование текста в его HTML-эквивалент — онлайн-инструмент для шифрования и дешифрования HTML-сущностей.