Parsing de HTML em C# (.NET): do simples ao complexo
O parsing de HTML é uma das tarefas principais no desenvolvimento de web scrapers, analisadores de conteúdo e ferramentas de automação. No ecossistema C# (.NET), existem várias bibliotecas maduras que permitem extrair dados de documentos HTML de forma eficiente, mesmo que a marcação seja inválida. Neste artigo, veremos as três ferramentas mais populares: HtmlAgilityPack, AngleSharp e CsQuery, além de analisarmos exemplos práticos de seu uso.
1. HtmlAgilityPack — a escolha clássica
HtmlAgilityPack (HAP) é a biblioteca mais comum para parsing de HTML em C#. Ela suporta XPath e LINQ, tornando-a ideal para trabalhar com estruturas hierárquicas. O HAP corrige automaticamente marcações HTML incorretas, o que é especialmente útil ao fazer parsing de páginas "cruas".
Instalação via NuGet:
Install-Package HtmlAgilityPackExemplo: extraindo todos os links de uma página
using HtmlAgilityPack;
string url = "https://example.com";var web = new HtmlWeb();var doc = web.Load(url);
var links = doc.DocumentNode.SelectNodes("//a[@href]");if (links != null){ foreach (var link in links) { string href = link.GetAttributeValue("href", ""); string text = link.InnerText.Trim(); Console.WriteLine($"{text}: {href}"); }}Exemplo: extraindo dados de uma tabela
var tableRows = doc.DocumentNode.SelectNodes("//table[@id='data-table']//tr");foreach (var row in tableRows){ var cells = row.SelectNodes("td"); if (cells != null) { var rowData = cells.Select(c => c.InnerText.Trim()).ToList(); Console.WriteLine(string.Join(" | ", rowData)); }}2. AngleSharp — a alternativa moderna
AngleSharp é uma biblioteca mais moderna, totalmente escrita em C# e em conformidade com as especificações do W3C. Ela suporta seletores CSS, tornando-a conveniente para quem está acostumado com a sintaxe semelhante ao jQuery. O AngleSharp também pode trabalhar com DOM, SVG e MathML.
Instalação via NuGet:
Install-Package AngleSharpExemplo: parsing usando seletores CSS
using AngleSharp;using AngleSharp.Dom;
var config = Configuration.Default.WithDefaultLoader();var context = BrowsingContext.New(config);var document = await context.OpenAsync("https://example.com");
// Obtém todos os elementos com a classe "product"var products = document.QuerySelectorAll(".product");foreach (var product in products){ var name = product.QuerySelector(".product-name")?.TextContent.Trim(); var price = product.QuerySelector(".product-price")?.TextContent.Trim(); Console.WriteLine($"{name}: {price}");}Exemplo: extraindo JSON de um script
var scripts = document.QuerySelectorAll("script[type='application/ld+json']");foreach (var script in scripts){ var json = script.TextContent; // Em seguida, pode-se desserializar o JSON usando System.Text.Json Console.WriteLine(json);}3. CsQuery — sintaxe semelhante ao jQuery
CsQuery é um port do jQuery para C#, que fornece uma API familiar para trabalhar com DOM. É especialmente útil para quem está migrando de JavaScript para C#. No entanto, vale notar que o projeto é atualizado com menos frequência que o AngleSharp e pode não suportar as versões mais recentes do .NET.
Instalação via NuGet:
Install-Package CsQueryExemplo: extraindo texto de elementos
using CsQuery;
string html = "<div class='content'><p>Olá, mundo!</p></div>";var dom = CQ.Create(html);
var text = dom[".content Também na biblioteca
InversifyJS: Contêiner IoC para aplicações TypeScript
NestJS para JavaScript (Node.js): guia completo com exemplos
Parsing de HTML em PHP: Guia Completo sobre Bibliotecas e Ferramentas
Bibliotecas WebSocket Rust: Tokio-tungstenite e async-tungstenite para tempo real