Análisis de HTML en Rust: visión general de herramientas y ejemplos prácticos
Rust es un lenguaje de programación de sistemas moderno que se utiliza cada vez más para crear raspadores y analizadores web de alto rendimiento. Gracias a su estricto sistema de tipos, seguridad de memoria y capacidades asíncronas, Rust es ideal para tareas que requieren extraer datos de documentos HTML de forma rápida y confiable. En este artículo, revisaremos las bibliotecas clave para el análisis de HTML en Rust, sus características y proporcionaremos ejemplos de código funcionales.
Bibliotecas principales para el análisis de HTML en Rust
El ecosistema de Rust ofrece varias soluciones maduras para trabajar con HTML. Las más populares son:
- scraper — biblioteca de alto nivel con soporte para selectores CSS, construida sobre
select.rsyhtml5ever. - select.rs — biblioteca para extraer datos del DOM mediante selectores CSS.
- html5ever — analizador de bajo nivel que cumple con el estándar HTML5 (utilizado internamente por Servo).
- quick-xml — analizador rápido de XML/HTML basado en lectura por flujo, adecuado para tareas simples.
Para la mayoría de las tareas de web scraping, se recomienda scraper, ya que proporciona una API conveniente y un soporte activo de la comunidad.
Instalación y configuración
Agregue la dependencia al archivo Cargo.toml:
[dependencies]scraper = "0.20"reqwest = { version = "0.12", features = ["blocking"] }La biblioteca reqwest se utiliza para solicitudes HTTP. Si prefiere un enfoque asíncrono, use reqwest con tokio.
Ejemplo 1: Extracción de títulos de página
Escribamos un analizador simple que obtenga el título <title> y todos los encabezados <h1> de una página web:
use scraper::{Html, Selector};
fn main() -> Result<(), Box<dyn std::error::Error>> { let html = r#" <html> <head><title>Página de ejemplo</title></head> <body> <h1>Primer encabezado</h1> <h1>Segundo encabezado</h1> </body> </html> "#;
let document = Html::parse_document(html);
// Extraer el título 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!("Título de la página: {}", title_text); }
// Extraer todos los 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(())} En este ejemplo, analizamos HTML estático. Para sitios web reales, el HTML generalmente se obtiene a través de una solicitud HTTP.
Ejemplo 2: Análisis de un sitio web real con solicitud HTTP
Ahora usaremos reqwest para descargar una página y extraer enlaces:
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!("Enlaces en la página:"); for link in document.select(&link_selector) { if let Some(href) = link.value().attr("href") { let text = link.text().collect::(); println!(" Texto: '{}' -> URL: {}", text.trim(), href); } }
Ok(())} Tenga en cuenta el método attr("href") — permite obtener el valor
También en la biblioteca
Trabajo con Kafka en Swift (iOS/macOS): bibliotecas, clientes y ejemplos
Machine Learning en Go: revisión de bibliotecas para Golang
Aprendizaje automático en Swift: bibliotecas para iOS/macOS
Geolocalización y mapas en PHP: bibliotecas, API y ejemplos de código