HTML Токенизатор

HTML Токенизатор

Токенизатор — первый этап парсинга HTML: он преобразует разметочный текст в поток токенов, определённых стандартом. Он является публичным API, поэтому инструменты, которым важны токены, а не деревья — линтеры, предварительные проходы санитайзеров, подсветка синтаксиса — могут напрямую потреблять этот поток.


Токенизация разметки

Tokenizer.tokenize() обрабатывает полный ввод; Tokenizer.tokenize_fragment() применяет правила токенизации фрагментов. Оба генерируют стандартный словарь токенов.

Классы токенов

Каждый токен — объект определённого типа: StartTagToken и EndTagToken для тегов (с атрибутами), CharacterToken для текста, CommentToken, DoctypeToken и EofToken обозначают конец ввода.

Состояния токенизатора

TokenizerState моделирует конечный автомат стандарта — те же состояния, которые перечислены в спецификации, — а Tokenizer.set_state() позволяет фрагментным и контекстно-чувствительным вызывающим начинать в правильном состоянии.

Символьные ссылки

Именованные и числовые символьные ссылки разрешаются через resolve_named_char_ref(), resolve_numeric_char_ref() и find_named_char_ref_match() — полную таблицу именованных ссылок, а не сокращённый набор.


Советы и лучшие практики

  • Используйте tokenize_fragment() с правильным начальным состоянием при токенизации содержимого, которое будет находиться внутри конкретного элемента.
  • Считайте EofToken окончательным сигналом завершения, а не исчерпывайте итератор с помощью исключения.
  • Для санитайзеров проверяйте атрибуты StartTagToken на уровне токенов до построения любого дерева.

Распространённые проблемы

ПроблемаПричинаИсправление
Содержимое скрипта/стиля токенизируется как разметкаНеправильное начальное состояние для контекстаУстановите соответствующий TokenizerState через set_state()
Сущности отображаются как неразрешённыеПотребление необработанного текста без разрешения ссылокИспользовать функции разрешения символьных ссылок
Фрагментный вывод отличается от полного разбораПравила фрагмента намеренно различаютсяИспользуйте tokenize() для полных документов

FAQ

Могу ли я использовать токенизатор без построения дерева?

Да — поток токенов является публичным, автономным выводом.

Являются ли состояния токенизатора стандартными?

TokenizerState отражает конечный автомат спецификации и может быть установлен через set_state().

Как обрабатываются именованные символьные ссылки?

С помощью resolve_named_char_ref() и find_named_char_ref_match() по полной таблице именованных ссылок.


API Reference Сводка

Класс/МетодОписание:
Tokenizer.tokenizeТокенизировать полный ввод
Tokenizer.tokenize_fragmentТокенизировать с правилами фрагмента
Tokenizer.set_stateУстановить начальное состояние токенизатора
StartTagTokenТокен начального тега с атрибутами
TokenizerStateСостояния машины состояний стандартов
resolve_named_char_refРазрешить именованную ссылку на символ

См. также:

 Русский