Как было показано ранее, cgi.escape преобразует текст, который должен быть включен в разметку HTML. Обычно эта утилита вызывается в сценариях CGI, но несложно исследовать ее действие и интерактивно:
>>> import cgi
>>> cgi.escape(‘a < b > c & d "spam"’, 1)
‘a < b > c & d "spam"’
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
‘1<2 <b>hello</b>’
Модуль cgi автоматически преобразует специальные символы HTML в соответствии с соглашениями HTML. Он преобразует символы <, >, &, а при передаче дополнительного аргумента True также символ ", в экранированные последовательности вида &X;, где X — мнемоника, обозначающая исходный символ. Например, < обозначает оператор «меньше» (<), а & обозначает литерал амперсанда (&).
В модуле cgi отсутствуют инструменты обрат но го преобразования экранированных последовательностей, потому что экранированные последовательности HTML распознаются в контексте анализатора HTML, подобно тому, как это делают веб-броузеры при загрузке страницы. В Python также есть полный анализатор HTML в виде стандартного модуля html.parser. Мы не станем здесь вникать в детали инструментов синтаксического анализа HTML (они описываются в главе 19, вместе с инструментами обработки текста), но чтобы показать, как экранированные последовательности в конечном итоге преобразуются обратно в неэкранированный вид, приведем пример работы модуля анализатора HTML, воспроизводящий последнюю строку в примере выше:
>>> import cgi, html.parser
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
‘1<2 <b>hello</b>’
>>>
>>> html.parser.HTMLParser().unescape(s)
‘1<2 <b>hello</b>’
Здесь для обратного преобразования используется вспомогательный метод класса, реализующего синтаксический анализ HTML. В главе 19 мы увидим, как использовать этот класс для решения более реальных задач, с созданием подклассов, переопределяющих методы, которые вызываются в процессе анализа при обнаружении тегов, данных, мнемоник и других элементов разметки. Продолжение этой истории и примеры более полноценного синтаксического анализа HTML вы найдете в главе 19.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011