HTML-Parsing in Rust: Überblick über die besten Bibliotheken und Codebeispiele
Rust ist eine Systemprogrammiersprache, die zunehmend für Aufgaben im Zusammenhang mit HTML-Parsing eingesetzt wird. Dank hoher Leistung, strenger Typisierung und Speichersicherheit eignet sich Rust hervorragend für die Erstellung schneller und zuverlässiger Webseiten-Parser. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für das HTML-Parsing in Rust, ihre Funktionen und geben praktische Codebeispiele.
Warum Rust für HTML-Parsing?
HTML-Parsing ist eine Aufgabe, die effiziente Speicherverwaltung und strenge Fehlerbehandlung erfordert. Rust bietet:
- Nullkosten-Abstraktionen — hohe Ausführungsgeschwindigkeit
- Sichere Speicherverwaltung ohne Garbage Collector
- Ein leistungsstarkes Typsystem, das Fehler bereits zur Kompilierzeit verhindert
- Eine aktive Community und viele Bibliotheken für Web Scraping
Wichtige Bibliotheken für HTML-Parsing in Rust
1. scraper — die beliebteste Bibliothek
Die Bibliothek scraper bietet eine benutzerfreundliche API zur Navigation im DOM-Baum mit CSS-Selektoren. Sie basiert auf dem Parser html5ever, der den HTML5-Standards entspricht.
Installation:
[dependencies]scraper = "0.18"Beispiel: Alle Links von einer Seite extrahieren
use scraper::{Html, Selector};
fn main() { let html = r#" <html> <body> <a href="https://example.com">Example</a> <a href="https://rust-lang.org">Rust</a> </body> </html> "#;
let document = Html::parse_document(html); let selector = Selector::parse("a").unwrap();
for element in document.select(&selector) { if let Some(href) = element.value().attr("href") { println!("Link: {}", href); } }}2. select.rs — leichter und schneller Selektor
Die Bibliothek select.rs bietet eine minimalistische Schnittstelle für die Arbeit mit CSS-Selektoren. Sie verwendet ebenfalls html5ever unter der Haube, bietet aber einen niedrigschwelligeren Zugriff auf das DOM.
Installation:
[dependencies]select = "0.6"Beispiel: Alle h2-Überschriften finden
use select::document::Document;use select::predicate::Name;
fn main() { let html = r#" <html> <body> <h2>Überschrift 1</h2> <h2>Überschrift 2</h2> <p>Text</p> </body> </html> "#;
let document = Document::from(html); for node in document.find(Name("h2")) { println!("Überschriftstext: {}", node.text()); }}3. html5ever — Low-Level-Parser
html5ever ist der Referenz-HTML5-Parser, geschrieben in Rust. Er bildet die Grundlage der meisten anderen Bibliotheken. Wenn Sie maximale Kontrolle über den Parsing-Prozess benötigen, verwenden Sie ihn direkt.
Beispiel: HTML-Tokenisierung
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use markup5ever::{expanded_name, local_name, namespace_url, ns};
fn main() { let html = "<p>Hallo, Rust!</p>"; let dom = parse_document( std::rc::Rc::new(std::cell::RefCell::new(vec![])), Default::default() ) .from_utf8() .read_from(&mut html.as_bytes()) .unwrap();}Praktisches Beispiel: Parsing einer echten Website
Betrachten wir ein vollständiges Beispiel für das Parsing einer Nachrichten-Website mit scraper und reqw
Auch in der Bibliothek
Redis-Client für TypeScript: ioredis und redis (node-redis)
Elasticsearch C++-Client: Vollständiger Leitfaden für die Arbeit mit der Suchmaschine
ASP.NET Core für C# (.NET): Vollständiger Leitfaden mit Beispielen
Arbeit mit Daten in C# (.NET): Überblick über Bibliotheken und integrierte Mittel