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 | Разрешить именованную ссылку на символ |