Обработка мнемоник HTML (еще раз)

obrabotka mnemonik html eshhe raz Текст и язык

Ниже приводится еще один пример анализа разметки HTML: в главе 15 мы использовали простой метод, экспортируемый этим модулем, чтобы преобразовать экранированные последовательности HTML (мнемоники) в строках, встроенных в HTML-страницу ответа:

>   >> import cgi, html.parser

>   >> s = cgi.escape("1<2 <b>hello</b>")

>>> s

‘1&lt;2 &lt;b&gt;hello&lt;/b&gt;’

>>> 

>   >> 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&lt;2 &lt;b&gt;hello&lt;/b&gt;’

>>> 

>   >> 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

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий