Parsing de HTML em Rust: visão geral das melhores bibliotecas e exemplos de código
Rust é uma linguagem de programação de sistemas que está sendo cada vez mais usada para tarefas relacionadas ao parsing de HTML. Graças ao alto desempenho, tipagem estrita e segurança de memória, Rust é ideal para criar parsers de páginas web rápidos e confiáveis. Neste artigo, veremos as principais bibliotecas para parsing de HTML em Rust, seus recursos e daremos exemplos práticos de código.
Por que Rust para parsing de HTML?
Parsing de HTML é uma tarefa que exige gerenciamento eficiente de memória e tratamento rigoroso de erros. Rust oferece:
- Abstrações de custo zero — alta velocidade de execução
- Gerenciamento seguro de memória sem coletor de lixo
- Sistema de tipos poderoso, prevenindo erros em tempo de compilação
- Comunidade ativa e muitas bibliotecas para web scraping
Principais bibliotecas para parsing de HTML em Rust
1. scraper — a biblioteca mais popular
A biblioteca scraper fornece uma API conveniente para navegação na árvore DOM usando seletores CSS. Ela é construída sobre o parser html5ever, que está em conformidade com os padrões HTML5.
Instalação:
[dependencies]scraper = "0.18"Exemplo: extraindo todos os links de uma 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!("Link: {}", href); } }}2. select.rs — seletor leve e rápido
A biblioteca select.rs oferece uma interface minimalista para trabalhar com seletores CSS. Ela também usa html5ever internamente, mas fornece acesso de nível mais baixo ao DOM.
Instalação:
[dependencies]select = "0.6"Exemplo: encontrando todos os títulos h2
use select::document::Document;use select::predicate::Name;
fn main() { let html = r#" <html> <body> <h2>Título 1</h2> <h2>Título 2</h2> <p>Texto</p> </body> </html> "#;
let document = Document::from(html); for node in document.find(Name("h2")) { println!("Texto do título: {}", node.text()); }}3. html5ever — parser de baixo nível
html5ever é o parser HTML5 de referência, escrito em Rust. Ele está na base da maioria das outras bibliotecas. Se você precisa de controle máximo sobre o processo de parsing, use-o diretamente.
Exemplo: tokenização de HTML
use html5ever::tendril::TendrilSink;use html5ever::parse_document;use markup5ever::{expanded_name, local_name, namespace_url, ns};
fn main() { let html = "<p>Hello, 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();}Exemplo prático: parsing de um site real
Vamos considerar um exemplo completo de parsing de um site de notícias usando scraper e reqw
Também na biblioteca
Filas de Tarefas em C# (.NET): System.Threading.Channels e TPL Dataflow
Trabalhando com CSV em C# (.NET): Guia Completo
PDFKit para JavaScript (Node.js): guia completo com exemplos
Cliente HTTP para Go (Golang): principais bibliotecas para trabalhar com HTTP
Envio de SMS em Java: Visão geral e exemplos de uso de bibliotecas API (Twilio, Nexmo)