HTML Tokenizador
HTML Tokenizador
O tokenizador é a primeira etapa da análise HTML: ele converte texto markup em um fluxo de tokens definidos por padrões. É API público, de modo que ferramentas que se importam com tokens ao invés de árvores — linters, pré-passagens de sanitização, realçadores de sintaxe — podem consumir o fluxo diretamente.
Tokenizando Markup
Tokenizer.tokenize() processa a entrada completa; Tokenizer.tokenize_fragment() aplica regras de tokenização de fragmentos. Ambos emitem o vocabulário padrão de tokens.
Classes de Token
Cada token é um objeto tipado: StartTagToken e EndTagToken para tags (com atributos), CharacterToken para texto, CommentToken, DoctypeToken e EofToken marcando o fim da entrada.
Estados do Tokenizador
TokenizerState modela a máquina de estados dos padrões — os mesmos estados que a especificação nomeia — e Tokenizer.set_state() permite que fragmentos e chamadores sensíveis ao contexto comecem no estado correto.
Referências de Caracteres
Referências de caracteres nomeadas e numéricas são resolvidas através de resolve_named_char_ref(), resolve_numeric_char_ref() e find_named_char_ref_match() — a tabela completa de referências nomeadas, não um subconjunto abreviado.
Dicas e Melhores Práticas
- Use
tokenize_fragment()com o estado inicial correto ao tokenizar conteúdo que apareceria dentro de um elemento específico. - Trate
EofTokencomo o sinal definitivo de término, em vez de esgotar o iterador por exceção. - Para sanitizadores, inspecione os atributos
StartTagTokenao nível do token antes que qualquer árvore seja construída.
Problemas Comuns
| Problema | Causa | Correção |
|---|---|---|
| O conteúdo de script/estilo é tokenizado como markup | Estado inicial incorreto para o contexto | Defina o TokenizerState apropriado via set_state() |
| Entidades aparecem não resolvidas | Consumindo texto bruto sem resolução de referência | Use as funções de resolvedor de char-ref |
| A saída do fragmento difere da análise completa | As regras de fragmento diferem intencionalmente | Use tokenize() para documentos completos |
FAQ
Posso usar o tokenizador sem construir uma árvore?
Sim — o fluxo de tokens é uma saída pública e independente.
Os estados do tokenizador são os padrões?
TokenizerState reflete a máquina de estados da especificação e pode ser configurado via set_state().
Como são tratadas as referências de caracteres nomeados?
Por meio de resolve_named_char_ref() e find_named_char_ref_match() contra a tabela completa de referências nomeadas.
API Reference Resumo
| Classe/Método | Descrição |
|---|---|
Tokenizer.tokenize | Tokenizar entrada completa |
Tokenizer.tokenize_fragment | Tokenizar com regras de fragmento |
Tokenizer.set_state | Defina o estado inicial do tokenizador |
StartTagToken | Token de tag de início com atributos |
TokenizerState | Estados da máquina de estado dos padrões |
resolve_named_char_ref | Resolver uma referência de caractere nomeada |