Parseo de HTML en Rust: descripción general de bibliotecas y ejemplos prácticos
Rust es un lenguaje de programación de sistemas que está ganando popularidad en tareas de web scraping y parseo de HTML gracias a su rendimiento, seguridad de memoria y tipado estricto. En este artículo, revisaremos las principales bibliotecas para parsear HTML en Rust, sus capacidades y proporcionaremos ejemplos de código para cada una.
1. Biblioteca scraper
scraper es una de las bibliotecas más populares y convenientes para parsear HTML en Rust. Está construida sobre html5ever (analizador HTML5) y proporciona una API de alto nivel para navegar por el árbol DOM mediante selectores CSS.
Instalación
[dependencies]scraper = "0.19"Ejemplo: obtención de títulos de artículos
use scraper::{Html, Selector};
fn main() { let html = r#" <html> <body> <h1 class="title">Primer artículo</h1> <h1 class="title">Segundo artículo</h1> </body> </html> "#;
let document = Html::parse_document(html); let selector = Selector::parse("h1.title").unwrap();
for element in document.select(&selector) { println!("{}", element.text().collect::<Vec<_>>().join(" ")); }}Ventajas:
- API intuitiva para selectores CSS
- Soporte para todas las pseudoclases y combinadores estándar
- Alto rendimiento
- Buena documentación
2. Biblioteca select.rs
select.rs es otra biblioteca potente para parsear HTML, basada en html5ever. Ofrece una API similar a jQuery, lo que la hace especialmente conveniente para desarrolladores familiarizados con JavaScript.
Instalación
[dependencies]select = "0.6"Ejemplo: extracción de enlaces
use select::document::Document;use select::predicate::{Name, Class};
fn main() { let html = r#" <html> <body> <a href="https://example.com" class="link">Example</a> <a href="https://rust-lang.org" class="link">Rust</a> </body> </html> "#;
let document = Document::from(html);
for node in document.find(Class("link")) { if let Some(href) = node.attr("href") { println!("Enlace: {}", href); } }}Ventajas:
- Sintaxis similar a jQuery
- Predicados flexibles para buscar elementos
- Soporte para atributos y contenido de texto
3. Biblioteca html5ever
html5ever es un analizador HTML5 de bajo nivel escrito en Rust. Es la base de muchas otras bibliotecas (incluyendo scraper y select.rs). Si necesita control total sobre el proceso de parseo, esta es una excelente opción.
Instalación
[dependencies]html5ever = "0.27"Ejemplo: tokenización de HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use html5ever::rcdom::{RcDom, Handle, NodeData};
fn main() { let html = "<p>¡Hola, Rust!</p>"; let dom = parse_document(RcDom::default(), Default::default()) .from_utf8() .read_from(&mut html.as_bytes()) .unwrap();
// Recorrido del árbol DOM fn walk(node: &Handle, depth: usize) { match node.data { NodeData::Text { ref contents } => { let text = contents.borrow(); println!("{:indent$}Texto: {}", "", text, indent = depth * 2); } NodeData::Element { ref name, También en la biblioteca
Programación reactiva en Kotlin: biblioteca RxKotlin y corutinas
Trabajo con CSV en PHP: lectura, escritura y procesamiento de datos
Internacionalización (i18n) en Go (Golang): Guía completa
Procesamiento de imágenes en Node.js: bibliotecas Sharp, Jimp y gm
Biblioteca estándar de Go (Golang): guía completa