3 个版本

0.5.2 2023 年 9 月 28 日
0.5.1 2023 年 9 月 3 日
0.5.0 2023 年 8 月 19 日
0.4.0 2021 年 12 月 5 日
0.1.0 2021 年 4 月 8 日

#742网页编程

Download history 31/week @ 2024-03-11 29/week @ 2024-04-01 3/week @ 2024-04-15 7/week @ 2024-05-13 8/week @ 2024-05-20 21/week @ 2024-05-27 17/week @ 2024-06-03 56/week @ 2024-06-10 41/week @ 2024-06-17 22/week @ 2024-06-24

每月 137 次下载

MIT 许可证

550KB
17K SLoC

html5tokenizer

docs.rs crates.io

符合规范的 HTML 解析 需要标记化和树构建。虽然这个crate实现了一个符合规范的HTML标记化器,但它没有实现任何树构建。相反,它只提供了一个 NaiveParser,可以使用如下方式

use std::fmt::Write;
use html5tokenizer::{NaiveParser, Token};

let html = "<title   >hello world</title>";
let mut new_html = String::new();

for token in NaiveParser::new(html).flatten() {
    match token {
        Token::StartTag(tag) => {
            write!(new_html, "<{}>", tag.name).unwrap();
        }
        Token::Char(c) => {
            write!(new_html, "{c}").unwrap();
        }
        Token::EndTag(tag) => {
            write!(new_html, "</{}>", tag.name).unwrap();
        }
        Token::EndOfFile => {},
        _ => panic!("unexpected input"),
    }
}

assert_eq!(new_html, "<title>hello world</title>");

这个库可以提供源代码片段。例如,请参阅 examples/spans.rs,它产生以下输出

note:
  ┌─ file.html:1:21<img src=example.jpg alt="some description">^^^ ^^^ ^^^^^^^^^^^ ^^^  ^^^^^^^^^^^^^^^^ attr value
  │  │   │   │           │
  │  │   │   │           attr name
  │  │   │   attr value
  │  │   attr name
  │  tag name

限制

  • 此crate尚未实现树构建
    (这是符合规范HTML解析所必需的)。

  • 此crate尚未实现 字符编码检测

合规性与测试

该标记化器通过了 html5lib标记化器测试套件。该库尚未进行模糊测试。

致谢

html5tokenizer是从 html5gum 0.2.1 分支出来的,由 Markus Unterwaditzer 创建,他为实现了所有 80 (!) 标记化器状态而应受到极大的赞誉。

  • 添加了代码片段支持。
  • API 已经过修订。

有关详细信息,请参阅 变更日志

许可证

在 MIT 许可证下发布,请参阅 LICENSE 文件

无运行时依赖