#css-selectors #html-parser #html-css #web-scraping #html #css #selector

accessibility-scraper

使用 CSS 选择器和 CSS 绑定样式对元素进行 HTML 解析和查询

13 个版本

0.0.14 2024 年 6 月 26 日
0.0.13 2024 年 6 月 26 日
0.0.12 2024 年 3 月 29 日
0.0.6 2024 年 2 月 15 日
0.0.5 2023 年 10 月 23 日

#1572 in 网页编程

Download history 10/week @ 2024-05-17 5/week @ 2024-05-24 6/week @ 2024-05-31 6/week @ 2024-06-07 5/week @ 2024-06-14 284/week @ 2024-06-21 72/week @ 2024-06-28 26/week @ 2024-07-05 31/week @ 2024-07-12 49/week @ 2024-07-19 81/week @ 2024-07-26 21/week @ 2024-08-02 28/week @ 2024-08-09 25/week @ 2024-08-16

170 每月下载量
2 crates 中使用

ISC 许可证

69KB
1.5K SLoC

accessibility-scraper

crates.io downloads test

使用 CSS 选择器进行 HTML 解析和查询。

accessibility-scraperCrates.ioGitHub 上。

Scraper 提供了 Servo 的 fast_html5everselectors crates 的接口,用于浏览器级别的解析和查询。

示例

解析文档

use accessibility-scraper::Html;

let html = r#"
    <!DOCTYPE html>
    <meta charset="utf-8">
    <title>Hello, world!</title>
    <h1 class="foo">Hello, <i>world!</i></h1>
"#;

let document = Html::parse_document(html);

解析片段

use accessibility-scraper::Html;
let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>");

解析选择器

use accessibility-scraper::Selector;
let selector = Selector::parse("h1.foo").unwrap();

选择元素

use accessibility-scraper::{Html, Selector};

let html = r#"
    <ul>
        <li>Foo</li>
        <li>Bar</li>
        <li>Baz</li>
    </ul>
"#;

let fragment = Html::parse_fragment(html);
let selector = Selector::parse("li").unwrap();

for element in fragment.select(&selector) {
    assert_eq!("li", element.value().name());
}

选择后代元素

use accessibility-scraper::{Html, Selector};

let html = r#"
    <ul>
        <li>Foo</li>
        <li>Bar</li>
        <li>Baz</li>
    </ul>
"#;

let fragment = Html::parse_fragment(html);
let ul_selector = Selector::parse("ul").unwrap();
let li_selector = Selector::parse("li").unwrap();

let ul = fragment.select(&ul_selector).next().unwrap();
for element in ul.select(&li_selector) {
    assert_eq!("li", element.value().name());
}

访问元素属性

use accessibility-scraper::{Html, Selector};

let fragment = Html::parse_fragment(r#"<input name="foo" value="bar">"#);
let selector = Selector::parse(r#"input[name="foo"]"#).unwrap();

let input = fragment.select(&selector).next().unwrap();
assert_eq!(Some("bar"), input.value().attr("value"));

序列化 HTML 和内联 HTML

use accessibility-scraper::{Html, Selector};

let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>");
let selector = Selector::parse("h1").unwrap();

let h1 = fragment.select(&selector).next().unwrap();

assert_eq!("<h1>Hello, <i>world!</i></h1>", h1.html());
assert_eq!("Hello, <i>world!</i>", h1.inner_html());

访问后代文本

use accessibility-scraper::{Html, Selector};

let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>");
let selector = Selector::parse("h1").unwrap();

let h1 = fragment.select(&selector).next().unwrap();
let text = h1.text().collect::<Vec<_>>();

assert_eq!(vec!["Hello, ", "world!"], text);

操作 DOM

use fast_html5ever::tree_builder::TreeSink;
use accessibility-scraper::{Html, Selector};

let html = "<html><body>hello<p class=\"hello\">REMOVE ME</p></body></html>";
let selector = Selector::parse(".hello").unwrap();
let mut document = Html::parse_document(html);
let node_ids: Vec<_> = document.select(&selector).map(|x| x.id()).collect();
for id in node_ids {
    document.remove_from_parent(&id);
}
assert_eq!(document.html(), "<html><head></head><body>hello</body></html>");

贡献

请随意提交 pull requests。如果您计划实现一些重大功能(例如,不是修复拼写错误、小错误修复、微重构等),那么请先提交一个 issue。

依赖项

~3–10MB
~108K SLoC