Parseo de HTML en Rust: bibliotecas y ejemplos prácticos

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

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

Recommendations