HTML-Parsing in Rust: Überblick über Werkzeuge und praktische Beispiele
Rust ist eine moderne Systemprogrammiersprache, die zunehmend für die Erstellung leistungsstarker Web-Scraper und Parser eingesetzt wird. Dank des strengen Typsystems, der Speichersicherheit und der asynchronen Fähigkeiten eignet sich Rust ideal für Aufgaben, bei denen Daten schnell und zuverlässig aus HTML-Dokumenten extrahiert werden müssen. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für das HTML-Parsing in Rust, ihre Besonderheiten und geben funktionierende Codebeispiele.
Wichtige Bibliotheken für HTML-Parsing in Rust
Das Rust-Ökosystem bietet mehrere ausgereifte Lösungen für die Arbeit mit HTML. Die beliebtesten sind:
- scraper — eine hochrangige Bibliothek mit Unterstützung für CSS-Selektoren, aufbauend auf
select.rsundhtml5ever. - select.rs — eine Bibliothek zum Extrahieren von Daten aus dem DOM mithilfe von CSS-Selektoren.
- html5ever — ein Low-Level-Parser, der dem HTML5-Standard entspricht (wird intern in Servo verwendet).
- quick-xml — ein schneller XML/HTML-Parser auf Basis von Streaming-Lesen, geeignet für einfache Aufgaben.
Für die meisten Web-Scraping-Aufgaben wird scraper empfohlen, da es eine benutzerfreundliche API und aktive Community-Unterstützung bietet.
Installation und Einrichtung
Fügen Sie die Abhängigkeit in die Datei Cargo.toml ein:
[dependencies]scraper = "0.20"reqwest = { version = "0.12", features = ["blocking"] }Die Bibliothek reqwest wird für HTTP-Anfragen verwendet. Wenn Sie einen asynchronen Ansatz bevorzugen, verwenden Sie reqwest mit tokio.
Beispiel 1: Extrahieren von Seitenüberschriften
Schreiben wir einen einfachen Parser, der den <title>-Titel und alle <h1>-Überschriften einer Webseite extrahiert:
use scraper::{Html, Selector};
fn main() -> Result<(), Box<dyn std::error::Error>> { let html = r#" <html> <head><title>Beispielseite</title></head> <body> <h1>Erste Überschrift</h1> <h1>Zweite Überschrift</h1> </body> </html> "#;
let document = Html::parse_document(html);
// Titel extrahieren let title_selector = Selector::parse("title").unwrap(); if let Some(title_element) = document.select(&title_selector).next() { let title_text = title_element.text().collect::().join(""); println!("Seitentitel: {}", title_text); }
// Alle h1 extrahieren let h1_selector = Selector::parse("h1").unwrap(); for element in document.select(&h1_selector) { let text = element.text().collect::().join(""); println!("H1: {}", text); }
Ok(())} In diesem Beispiel parsen wir statisches HTML. Für echte Websites wird HTML normalerweise über eine HTTP-Anfrage abgerufen.
Beispiel 2: Parsen einer echten Website mit HTTP-Anfrage
Jetzt verwenden wir reqwest, um eine Seite zu laden und Links zu extrahieren:
use scraper::{Html, Selector};
fn main() -> Result<(), Box<dyn std::error::Error>> { let response = reqwest::blocking::get("https://www.rust-lang.org")?; let html = response.text()?;
let document = Html::parse_document(&html); let link_selector = Selector::parse("a[href]").unwrap();
println!("Links auf der Seite:"); for link in document.select(&link_selector) { if let Some(href) = link.value().attr("href") { let text = link.text().collect::(); println!(" Text: '{}' -> URL: {}", text.trim(), href); } }
Ok(())} Beachten Sie die Methode attr("href") — sie ermöglicht das Abrufen von W
Auch in der Bibliothek
tRPC für TypeScript: Vollständiger Leitfaden mit Beispielen
PDF-Erstellung in C++: Bibliotheken, Werkzeuge und Codebeispiele
ORM für Swift (iOS/macOS): Vergleich und Anwendungsbeispiele
GraphQL in Swift: Vollständiger Leitfaden zur Apollo iOS Bibliothek
Event Bus und das Observer-Pattern in C# (.NET): Implementierung und Beispiele