Análisis de HTML en Rust: bibliotecas y ejemplos para web scraping

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.rs y html5ever.
  • 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

Recommendations