Parsing HTML en Rust : aperçu des meilleures bibliothèques et exemples de code
Rust est un langage de programmation système de plus en plus utilisé pour les tâches liées au parsing HTML. Grâce à ses hautes performances, son typage strict et sa sécurité mémoire, Rust est idéal pour créer des parseurs de pages web rapides et fiables. Dans cet article, nous examinerons les principales bibliothèques pour le parsing HTML en Rust, leurs fonctionnalités et fournirons des exemples de code pratiques.
Pourquoi Rust pour le parsing HTML ?
Le parsing HTML est une tâche qui nécessite une gestion efficace de la mémoire et un traitement rigoureux des erreurs. Rust offre :
- Des abstractions à coût zéro — une vitesse d'exécution élevée
- Une gestion sécurisée de la mémoire sans ramasse-miettes
- Un système de types puissant qui prévient les erreurs à la compilation
- Une communauté active et de nombreuses bibliothèques pour le web scraping
Principales bibliothèques pour le parsing HTML en Rust
1. scraper — la bibliothèque la plus populaire
La bibliothèque scraper fournit une API pratique pour naviguer dans l'arbre DOM à l'aide de sélecteurs CSS. Elle est construite sur le parseur html5ever, conforme aux normes HTML5.
Installation :
[dependencies]scraper = "0.18"Exemple : extraction de tous les liens d'une page
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!("Lien : {}", href); } }}2. select.rs — sélecteur léger et rapide
La bibliothèque select.rs propose une interface minimaliste pour travailler avec les sélecteurs CSS. Elle utilise également html5ever en interne, mais offre un accès de plus bas niveau au DOM.
Installation :
[dependencies]select = "0.6"Exemple : recherche de tous les titres h2
use select::document::Document;use select::predicate::Name;
fn main() { let html = r#" <html> <body> <h2>Titre 1</h2> <h2>Titre 2</h2> <p>Texte</p> </body> </html> "#;
let document = Document::from(html); for node in document.find(Name("h2")) { println!("Texte du titre : {}", node.text()); }}3. html5ever — parseur de bas niveau
html5ever est le parseur HTML5 de référence, écrit en Rust. Il est à la base de la plupart des autres bibliothèques. Si vous avez besoin d'un contrôle maximal sur le processus de parsing, utilisez-le directement.
Exemple : tokenisation HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use markup5ever::{expanded_name, local_name, namespace_url, ns};
fn main() { let html = "<p>Bonjour, 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();}Exemple pratique : parsing d'un site réel
Considérons un exemple complet de parsing d'un site d'actualités en utilisant scraper et reqw
Aussi dans la bibliothèque
Traitement des images en PHP : guide complet sur GD et Imagick
Parsing HTML en C# (.NET) : bibliothèques HtmlAgilityPack et AngleSharp
Autorisation et authentification dans Node.js : JWT, Passport.js, bcrypt
Compression JavaScript (Node.js) : guide complet avec exemples
Validation des données en Swift : bibliothèque Validator