HTML 分词器

HTML 分词器

Tokenizer 是 HTML 解析的第一阶段:它将标记文本转换为标准定义的 token 流。它是公开的 API,因此关注 token 而非树的工具——linters、sanitizer pre-passes、syntax highlighters——可以直接消费该流。


标记化标记

Tokenizer.tokenize() 处理完整输入;Tokenizer.tokenize_fragment() 应用片段分词规则。两者都输出标准 token 词汇。

Token 类

每个 token 是一个带类型的对象: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 属性

常见问题

问题原因修复
脚本/样式内容被标记为 markup上下文的初始状态错误通过 set_state() 设置适当的 TokenizerState
实体未解析在未进行 reference resolution 的情况下消费原始文本使用 char-ref 解析函数
片段输出与完整解析不同片段规则有意不同对完整文档使用 tokenize()

FAQ

我可以在不构建树的情况下使用分词器吗?

是的 — token 流是公开的、独立的输出。

分词器状态是标准的吗?

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解析命名字符引用

另请参阅

 中文