Parsing HTML en Rust : bibliothèques et exemples pour le web scraping

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Parsing HTML en Rust : aperçu des outils et exemples pratiques



Rust est un langage de programmation système moderne, de plus en plus utilisé pour créer des scrapers et parseurs web haute performance. Grâce à son système de types strict, sa sécurité mémoire et ses capacités asynchrones, Rust est idéal pour les tâches nécessitant une extraction rapide et fiable de données à partir de documents HTML. Dans cet article, nous examinerons les bibliothèques clés pour le parsing HTML en Rust, leurs caractéristiques et fournirons des exemples de code fonctionnels.



Bibliothèques principales pour le parsing HTML en Rust



L'écosystème Rust propose plusieurs solutions matures pour travailler avec HTML. Les plus populaires sont :



  • scraper — une bibliothèque de haut niveau avec prise en charge des sélecteurs CSS, construite sur select.rs et html5ever.
  • select.rs — une bibliothèque pour extraire des données du DOM à l'aide de sélecteurs CSS.
  • html5ever — un parseur de bas niveau conforme à la norme HTML5 (utilisé en interne par Servo).
  • quick-xml — un parseur XML/HTML rapide basé sur la lecture en flux, adapté aux tâches simples.


Pour la plupart des tâches de web scraping, scraper est recommandé car il offre une API pratique et un support actif de la communauté.



Installation et configuration



Ajoutez la dépendance dans le fichier Cargo.toml :



[dependencies]scraper = "0.20"reqwest = { version = "0.12", features = ["blocking"] }


La bibliothèque reqwest est utilisée pour les requêtes HTTP. Si vous préférez une approche asynchrone, utilisez reqwest avec tokio.



Exemple 1 : Extraction des titres de page



Écrivons un parseur simple qui récupère le titre <title> et tous les titres <h1> d'une page web :



use scraper::{Html, Selector};

fn main() -> Result<(), Box<dyn std::error::Error>> { let html = r#" <html> <head><title>Exemple de page</title></head> <body> <h1>Premier titre</h1> <h1>Deuxième titre</h1> </body> </html> "#;

let document = Html::parse_document(html);

// Extraction du titre 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!("Titre de la page : {}", title_text); }

// Extraction de tous les h1 let h1_selector = Selector::parse("h1").unwrap(); for element in document.select(&h1_selector) { let text = element.text().collect::().join(""); println!("H1 : {}", text); }

Ok(())}


Dans cet exemple, nous analysons du HTML statique. Pour les sites réels, le HTML est généralement obtenu via une requête HTTP.



Exemple 2 : Parsing d'un site réel avec requête HTTP



Utilisons maintenant reqwest pour charger une page et extraire les liens :



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!("Liens sur la page :"); for link in document.select(&link_selector) { if let Some(href) = link.value().attr("href") { let text = link.text().collect::(); println!(" Texte : '{}' -> URL : {}", text.trim(), href); } }

Ok(())}


Notez la méthode attr("href") — elle permet d'obtenir les va

Recommendations