Parsing de HTML em Rust: visão geral das bibliotecas e exemplos práticos
Rust — uma linguagem de programação de sistemas que está ganhando popularidade em tarefas de web scraping e parsing de HTML devido ao seu desempenho, segurança de memória e tipagem forte. Neste artigo, vamos explorar as principais bibliotecas para parsing de HTML em Rust, suas funcionalidades e fornecer exemplos de código para cada uma delas.
1. Biblioteca scraper
scraper — uma das bibliotecas mais populares e convenientes para parsing de HTML em Rust. Ela é construída sobre o html5ever (parser HTML5) e fornece uma API de alto nível para navegação na árvore DOM usando seletores CSS.
Instalação
[dependencies]scraper = "0.19"Exemplo: obtendo títulos de artigos
use scraper::{Html, Selector};
fn main() { let html = r#" <html> <body> <h1 class="title">Primeiro artigo</h1> <h1 class="title">Segundo artigo</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(" ")); }}Vantagens:
- API intuitiva para seletores CSS
- Suporte a todas as pseudoclasses e combinadores padrão
- Alto desempenho
- Boa documentação
2. Biblioteca select.rs
select.rs — outra biblioteca poderosa para parsing de HTML, baseada no html5ever. Ela oferece uma API semelhante ao jQuery, tornando-a especialmente conveniente para desenvolvedores familiarizados com JavaScript.
Instalação
[dependencies]select = "0.6"Exemplo: extraindo links
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!("Link: {}", href); } }}Vantagens:
- Sintaxe semelhante ao jQuery
- Predicados flexíveis para busca de elementos
- Suporte a atributos e conteúdo textual
3. Biblioteca html5ever
html5ever — um parser HTML5 de baixo nível escrito em Rust. Ele é a base para muitas outras bibliotecas (incluindo scraper e select.rs). Se você precisa de controle total sobre o processo de parsing, esta é uma excelente escolha.
Instalação
[dependencies]html5ever = "0.27"Exemplo: tokenização de HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use html5ever::rcdom::{RcDom, Handle, NodeData};
fn main() { let html = "<p>Olá, Rust!</p>"; let dom = parse_document(RcDom::default(), Default::default()) .from_utf8() .read_from(&mut html.as_bytes()) .unwrap();
// Percorrendo a árvore 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,