#html-parser #html #css-selectors #html-css #css-parser #css #selector

bin+lib dom-manipulator

一个用于HTML解析、查询和序列化的库

1个不稳定版本

0.1.0 2022年8月25日

#2227 in Web编程

ISC许可证

54KB
1K SLoC

DOM Manipulator - Scraper的分支

crates.io package test Join the chat at https://gitter.im/scraper-rs/community

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

scraperCrates.ioGitHub上。

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

示例

解析文档

use 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 scraper::Html;
let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>");

解析选择器

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

选择元素

use 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 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 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 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 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);

将内容序列化回HTML

use scraper::{Html, Selector};

let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>")

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

贡献

请随意提交pull请求。如果您计划实现一些较大的功能(即不是修复拼写错误、小错误修复、轻微重构等),请首先提交一个issue。

依赖项

~3.5–9.5MB
~94K SLoC