Parseo de HTML en Rust: revisión de las mejores bibliotecas y ejemplos de código
Rust es un lenguaje de programación de sistemas que se utiliza cada vez más para tareas relacionadas con el parseo de HTML. Gracias a su alto rendimiento, tipado estricto y seguridad de memoria, Rust es ideal para crear parsers de páginas web rápidos y fiables. En este artículo, analizaremos las principales bibliotecas para el parseo de HTML en Rust, sus capacidades y proporcionaremos ejemplos prácticos de código.
¿Por qué Rust para el parseo de HTML?
El parseo de HTML es una tarea que requiere una gestión eficiente de la memoria y un manejo riguroso de errores. Rust ofrece:
- Abstracciones de costo cero — alta velocidad de ejecución
- Gestión segura de la memoria sin recolector de basura
- Un potente sistema de tipos que previene errores en tiempo de compilación
- Una comunidad activa y muchas bibliotecas para web scraping
Bibliotecas principales para el parseo de HTML en Rust
1. scraper — la biblioteca más popular
La biblioteca scraper proporciona una API conveniente para navegar por el árbol DOM utilizando selectores CSS. Está construida sobre el parser html5ever, que cumple con los estándares de HTML5.
Instalación:
[dependencies]scraper = "0.18"Ejemplo: extraer todos los enlaces de una página
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!("Enlace: {}", href); } }}2. select.rs — selector ligero y rápido
La biblioteca select.rs ofrece una interfaz minimalista para trabajar con selectores CSS. También utiliza html5ever internamente, pero proporciona un acceso de más bajo nivel al DOM.
Instalación:
[dependencies]select = "0.6"Ejemplo: buscar todos los encabezados h2
use select::document::Document;use select::predicate::Name;
fn main() { let html = r#" <html> <body> <h2>Encabezado 1</h2> <h2>Encabezado 2</h2> <p>Texto</p> </body> </html> "#;
let document = Document::from(html); for node in document.find(Name("h2")) { println!("Texto del encabezado: {}", node.text()); }}3. html5ever — parser de bajo nivel
html5ever es el parser de referencia de HTML5, escrito en Rust. Es la base de la mayoría de las otras bibliotecas. Si necesita el máximo control sobre el proceso de parseo, úselo directamente.
Ejemplo: tokenización de HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use markup5ever::{expanded_name, local_name, namespace_url, ns};
fn main() { let html = "<p>¡Hola, 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();}Ejemplo práctico: parseo de un sitio web real
Consideremos un ejemplo completo de parseo de un sitio de noticias utilizando scraper y reqw
También en la biblioteca
Internacionalización (i18n) en TypeScript: biblioteca i18next
Trabajo con Kafka en PHP: bibliotecas, instalación y ejemplos de código
Clientes Redis para Kotlin: Lettuce, Redisson y Kredis
Pruebas en PHP: resumen de frameworks y herramientas (PHPUnit, Pest, Codeception)