Parsing de HTML em C# (.NET): visão geral das bibliotecas HtmlAgilityPack e AngleSharp
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, manipular a árvore DOM e fazer consultas a elementos. Neste artigo, vamos examinar detalhadamente as duas bibliotecas mais populares: HtmlAgilityPack e AngleSharp, seus recursos, sintaxe e exemplos de uso.
1. HtmlAgilityPack — uma ferramenta testada pelo tempo
HtmlAgilityPack (HAP) é uma das bibliotecas mais antigas e amplamente utilizadas para parsing de HTML em .NET. Ela suporta tanto .NET Framework quanto .NET Core / .NET 5+. A principal vantagem é a simplicidade e a tolerância a falhas ao trabalhar com HTML "sujo" (marcação inválida, tags não fechadas).
Instalação
// Através do NuGet Package ManagerInstall-Package HtmlAgilityPack
// Ou via .NET CLIdotnet add package HtmlAgilityPackExemplo básico: extração de títulos H1
using HtmlAgilityPack;
string html = @"<html><body> <h1>Título 1</h1> <h1>Título 2</h1> <p>Texto do parágrafo</p></body></html>";
var doc = new HtmlDocument();doc.LoadHtml(html);
var h1Nodes = doc.DocumentNode.SelectNodes("//h1");if (h1Nodes != null){ foreach (var node in h1Nodes) { Console.WriteLine(node.InnerText.Trim()); }}// Saída:// Título 1// Título 2Uso de XPath e seletores CSS
HtmlAgilityPack usa XPath por padrão para navegação. No entanto, com o pacote HtmlAgilityPack.CssSelectors, é possível usar seletores CSS:
// Instalação: dotnet add package HtmlAgilityPack.CssSelectorsusing HtmlAgilityPack.CssSelectors;
// ... após carregar o documentovar links = doc.DocumentNode.QuerySelectorAll("a.external-link");foreach (var link in links){ Console.WriteLine(link.GetAttributeValue("href", ""));}Parsing de um site real
using System.Net.Http;using HtmlAgilityPack;
var url = "https://example.com/articles";var httpClient = new HttpClient();var html = await httpClient.GetStringAsync(url);
var doc = new HtmlDocument();doc.LoadHtml(html);
// Extrai todos os títulos de artigosvar articles = doc.DocumentNode.SelectNodes("//article/h2/a");if (articles != null){ foreach (var article in articles) { var title = article.InnerText.Trim(); var link = article.GetAttributeValue("href", ""); Console.WriteLine($"{title} -> {link}"); }}2. AngleSharp — uma alternativa moderna
AngleSharp é uma biblioteca mais recente que oferece suporte completo a HTML5, CSS3, JavaScript (limitado) e especificações DOM. Ela é ideal para tarefas que exigem conformidade precisa com a renderização do navegador. Suporta .NET Standard 2.0+, o que significa compatibilidade com .NET Framework 4.6.1+ e .NET Core.
Instalação
dotnet add package AngleSharpExemplo básico: extração de todos os links
using AngleSharp;using AngleSharp.Dom;using AngleSharp.Html.Parser;
var html = @"<html><body> <a href='https://example.com'>Example</a> <a href='https://test.com'>Test</a></body></html>";
var parser = new HtmlParser();IDocument document = parser.ParseDocument(html);
var links = document.QuerySelectorAll("a");foreach (var link in links){ Console.WriteLine($"{link.TextContent} -> {link.GetAttribute("href")}");}// Saída:// Example -> https://example.com// Test -> https://test.com