Ниже приводится еще один пример анализа разметки HTML: в главе 15 мы использовали простой метод, экспортируемый этим модулем, чтобы преобразовать экранированные последовательности HTML (мнемоники) в строках, встроенных в 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, но это не все. Когда мы рассматривали это решение, я давал понять, что существует более универсальный подход. Теперь, когда вы познакомились с моделью методов обратного вызова парсера HTML, есть смысл рассмотреть более характерный для Python способ обработки мнемоник в процессе анализа — достаточно просто перехватывать события обнаружения мнемоник в подклассе парсера и выполнять необходимые преобразования:
> >> class Parse(html.parser.HTMLParser):
… def handle_data(self, data):
… print(data, end=»)
… def handle_entityref(self, name):
… map = dict(lt='<‘, gt=’>’)
… print(map[name], end=»)
…
> >> p = Parse()
> >> p.feed(s); print()
1<2 <b>hello</b>
Или, что еще лучше, использовать модуль Python html.entities, чтобы избежать необходимости определять таблицу преобразований мнемоник HTML в символы. Этот модуль определяет значительно большее количество мнемоник, чем простой словарь в предыдущем примере, и включает все мнемоники, с которыми можно столкнуться при анализе текста HTML:
> >> s
‘1<2 <b>hello</b>’
>>>
> >> from html.entities import entitydefs
> >> class Parse(html.parser.HTMLParser):
… def handle_data(self, data):
… print(data, end=»)
… def handle_entityref(self, name):
… print(entitydefs[name], end=»)
> >> P = Parse()
> >> P.feed(s); print()
1<2 <b>hello</b>
Строго говоря, модуль html.entities способен отображать имена мнемоник в кодовые пункты Юникода и наоборот — таблица, используемая здесь, просто преобразует целочисленные кодовые пункты в символы с помощью функции chr. Дополнительные подробности ищите в описании этого модуля, а также в его исходном программном коде в стандартной библиотеке Python.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011