Análisis de HTML en C# (.NET): descripción general de las bibliotecas HtmlAgilityPack y AngleSharp
El análisis de HTML es una de las tareas clave al desarrollar scrapers web, analizadores de contenido y herramientas de automatización. En el ecosistema de C# (.NET), existen varias bibliotecas maduras que permiten extraer datos de documentos HTML, manipular el árbol DOM y realizar consultas a elementos. En este artículo, analizaremos en detalle las dos bibliotecas más populares: HtmlAgilityPack y AngleSharp, sus capacidades, sintaxis y ejemplos de uso.
1. HtmlAgilityPack: una herramienta probada por el tiempo
HtmlAgilityPack (HAP) es una de las bibliotecas más antiguas y extendidas para el análisis de HTML en .NET. Es compatible tanto con .NET Framework como con .NET Core / .NET 5+. Su principal ventaja es la simplicidad y la tolerancia a fallos al trabajar con HTML "sucio" (marcado no válido, etiquetas no cerradas).
Instalación
// A través del Administrador de paquetes NuGetInstall-Package HtmlAgilityPack
// O a través de .NET CLIdotnet add package HtmlAgilityPackEjemplo básico: extracción de encabezados H1
using HtmlAgilityPack;
string html = @"<html><body> <h1>Encabezado 1</h1> <h1>Encabezado 2</h1> <p>Texto del párrafo</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()); }}// Salida:// Encabezado 1// Encabezado 2Uso de XPath y selectores CSS
HtmlAgilityPack utiliza XPath de forma predeterminada para la navegación. Sin embargo, con el paquete HtmlAgilityPack.CssSelectors se pueden aplicar selectores CSS:
// Instalación: dotnet add package HtmlAgilityPack.CssSelectorsusing HtmlAgilityPack.CssSelectors;
// ... después de cargar el documentovar links = doc.DocumentNode.QuerySelectorAll("a.external-link");foreach (var link in links){ Console.WriteLine(link.GetAttributeValue("href", ""));}Análisis de un sitio web 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);
// Extraemos todos los encabezados de artículosvar 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: una alternativa moderna
AngleSharp es una biblioteca más reciente que ofrece soporte completo para HTML5, CSS3, JavaScript (de forma limitada) y las especificaciones del DOM. Es ideal para tareas que requieren una correspondencia precisa con el renderizado del navegador. Es compatible con .NET Standard 2.0+, lo que significa compatibilidad con .NET Framework 4.6.1+ y .NET Core.
Instalación
dotnet add package AngleSharpEjemplo básico: extracción de todos los enlaces
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")}");}// Salida:// Example -> https://example.com// Test -> https://test.comTrabajo con atributos
También en la biblioteca
Geolocalización y mapas en TypeScript: bibliotecas, API y ejemplos de código
tRPC para TypeScript: guía completa con ejemplos
ORM para TypeScript: comparación de TypeORM, Prisma y MikroORM
Trabajo con Excel en TypeScript: bibliotecas, ejemplos y herramientas