Parsing de HTML em Rust: bibliotecas e exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations