HTML-Parsing in Rust: Überblick über Bibliotheken und praktische Beispiele
Rust ist eine systemnahe Programmiersprache, die aufgrund ihrer Leistung, Speichersicherheit und strengen Typisierung bei Aufgaben des Web-Scrapings und HTML-Parsings immer beliebter wird. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für HTML-Parsing in Rust, ihre Funktionen und geben Codebeispiele für jede von ihnen.
1. Bibliothek scraper
scraper ist eine der beliebtesten und benutzerfreundlichsten Bibliotheken für HTML-Parsing in Rust. Sie basiert auf html5ever (HTML5-Parser) und bietet eine hochwertige API zur Navigation im DOM-Baum mit CSS-Selektoren.
Installation
[dependencies]scraper = "0.19"Beispiel: Abrufen von Artikelüberschriften
use scraper::{Html, Selector};
fn main() { let html = r#" <html> <body> <h1 class="title">Erster Artikel</h1> <h1 class="title">Zweiter Artikel</h1> </body> </html> "#;
let document = Html::parse_document(html); let selector = Selector::parse("h1.title").unwrap();
for element in document.select(&selector) { println!("{}", element.text().collect::<Vec<_>>().join(" ")); }}Vorteile:
- Intuitive API für CSS-Selektoren
- Unterstützung aller standardmäßigen Pseudoklassen und Kombinatoren
- Hohe Leistung
- Gute Dokumentation
2. Bibliothek select.rs
select.rs ist eine weitere leistungsstarke Bibliothek für HTML-Parsing, die auf html5ever basiert. Sie bietet eine jQuery-ähnliche API, was sie besonders praktisch für Entwickler macht, die mit JavaScript vertraut sind.
Installation
[dependencies]select = "0.6"Beispiel: Extrahieren von Links
use select::document::Document;use select::predicate::{Name, Class};
fn main() { let html = r#" <html> <body> <a href="https://example.com" class="link">Example</a> <a href="https://rust-lang.org" class="link">Rust</a> </body> </html> "#;
let document = Document::from(html);
for node in document.find(Class("link")) { if let Some(href) = node.attr("href") { println!("Link: {}", href); } }}Vorteile:
- jQuery-ähnliche Syntax
- Flexible Prädikate zur Elementsuche
- Unterstützung von Attributen und Textinhalten
3. Bibliothek html5ever
html5ever ist ein Low-Level-HTML5-Parser, der in Rust geschrieben ist. Er bildet die Grundlage für viele andere Bibliotheken (einschließlich scraper und select.rs). Wenn Sie die vollständige Kontrolle über den Parsing-Prozess benötigen, ist dies eine ausgezeichnete Wahl.
Installation
[dependencies]html5ever = "0.27"Beispiel: Tokenisierung von HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use html5ever::rcdom::{RcDom, Handle, NodeData};
fn main() { let html = "<p>Hallo, Rust!</p>"; let dom = parse_document(RcDom::default(), Default::default()) .from_utf8() .read_from(&mut html.as_bytes()) .unwrap();
// DOM-Baum durchlaufen fn walk(node: &Handle, depth: usize) { match node.data { NodeData::Text { ref contents } => { let text = contents.borrow(); println!("{:indent$}Text: {}", "", text, indent = depth * 2); } NodeData::Element { ref name,