6 个版本
0.14.5 | 2023 年 2 月 26 日 |
---|---|
0.14.4 | 2023 年 2 月 26 日 |
#2391 in Web 编程
30 每月下载量
63KB
1.5K SLoC
fast_scraper
使用 CSS 选择器进行 HTML 解析和查询。
fast_scraper
可在 Crates.io 和 GitHub 上找到。
Scraper 提供了一个接口,用于 Servo 的 html5ever
和 selectors
Crates,用于浏览器级别的解析和查询。
示例
解析文档
use fast_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 fast_scraper::Html;
let fragment = Html::parse_fragment("<h1>Hello, <i>world!</i></h1>");
解析选择器
use fast_scraper::Selector;
let selector = Selector::parse("h1.foo").unwrap();
选择元素
use fast_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 fast_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 fast_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 fast_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 fast_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);
贡献
请随意提交 pull request。如果您计划实现一些大的功能(即不修复错别字、小的错误修复、轻微的重构等),那么请先提交 issue。
依赖关系
~3–9.5MB
~84K SLoC