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