scraper
HTML parsing and querying with CSS selectors.
scraper
is on Crates.io and GitHub.
Scraper provides an interface to Servo's html5ever
and selectors
crates, for browser-grade parsing and querying.
Examples
Parsing a document
Hello, world!
"#; let document = Html::parse_document(html);">use scraper::Html;
let html = r#"
Hello, world!
Hello, world!
"#;
let document = Html::parse_document(html);
Parsing a fragment
use scraper::Html;
let fragment = Html::parse_fragment("Hello, world!
");
Parsing a selector
use scraper::Selector;
let selector = Selector::parse("h1.foo").unwrap();
Selecting elements
use scraper::{Html, Selector};
let html = r#"
Foo
Bar
Baz
"#;
let fragment = Html::parse_fragment(html);
let selector = Selector::parse("li").unwrap();
for element in fragment.select(&selector) {
assert_eq!("li", element.value().name());
}
Selecting descendent elements
use scraper::{Html, Selector};
let html = r#"
Foo
Bar
Baz
"#;
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());
}
Accessing element attributes
use scraper::{Html, Selector};
let fragment = Html::parse_fragment(r#""#);
let selector = Selector::parse(r#"input[name="foo"]"#).unwrap();
let input = fragment.select(&selector).next().unwrap();
assert_eq!(Some("bar"), input.value().attr("value"));
Serializing HTML and inner HTML
Hello, world!
", h1.html()); assert_eq!("Hello, world!", h1.inner_html());">use scraper::{Html, Selector};
let fragment = Html::parse_fragment("Hello, world!
");
let selector = Selector::parse("h1").unwrap();
let h1 = fragment.select(&selector).next().unwrap();
assert_eq!("Hello, world!
", h1.html());
assert_eq!("Hello, world!", h1.inner_html());
Accessing descendent text
use scraper::{Html, Selector}; let fragment = Html::parse_fragment("Hello, world!
"); 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);
Contributing
Please feel free to open pull requests. If you're planning on implementing something big (i.e. not fixing a typo, a small bug fix, minor refactor, etc) then please open an issue first.
Stargazers over time
License: ISC