Análisis de HTML en C# (.NET): de lo simple a lo complejo
El análisis de HTML es una de las tareas clave en el desarrollo de web scrapers, 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 de manera eficiente, incluso si el marcado no es válido. En este artículo, revisaremos las tres herramientas más populares: HtmlAgilityPack, AngleSharp y CsQuery, y analizaremos ejemplos prácticos de su uso.
1. HtmlAgilityPack — la elección clásica
HtmlAgilityPack (HAP) es la biblioteca más común para el análisis de HTML en C#. Soporta XPath y LINQ, lo que la hace ideal para trabajar con estructuras jerárquicas. HAP corrige automáticamente el marcado HTML incorrecto, lo que es especialmente útil al analizar páginas "en bruto".
Instalación a través de NuGet:
Install-Package HtmlAgilityPackEjemplo: extraer todos los enlaces de una 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}"); }}Ejemplo: extraer datos de una tabla
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 — la alternativa moderna
AngleSharp es una biblioteca más moderna, completamente escrita en C# y que cumple con las especificaciones de W3C. Soporta selectores CSS, lo que la hace conveniente para quienes están acostumbrados a la sintaxis similar a jQuery. AngleSharp también puede trabajar con DOM, SVG y MathML.
Instalación a través de NuGet:
Install-Package AngleSharpEjemplo: análisis usando selectores CSS
using AngleSharp;using AngleSharp.Dom;
var config = Configuration.Default.WithDefaultLoader();var context = BrowsingContext.New(config);var document = await context.OpenAsync("https://example.com");
// Obtenemos todos los elementos con la clase "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}");}Ejemplo: extraer JSON de un script
var scripts = document.QuerySelectorAll("script[type='application/ld+json']");foreach (var script in scripts){ var json = script.TextContent; // Luego se puede deserializar el JSON usando System.Text.Json Console.WriteLine(json);}3. CsQuery — sintaxis similar a jQuery
CsQuery es un puerto de jQuery para C# que proporciona una API familiar para trabajar con el DOM. Es especialmente útil para quienes migran de JavaScript a C#. Sin embargo, cabe destacar que el proyecto se actualiza con menos frecuencia que AngleSharp y puede no ser compatible con las últimas versiones de .NET.
Instalación a través de NuGet:
Install-Package CsQueryEjemplo: extraer texto de elementos
using CsQuery;
string html = "<div class='content'><p>¡Hola, mundo!</p></div>";var dom = CQ.Create(html);
var text = dom[".content También en la biblioteca
Trabajo con XML en Rust: bibliotecas quick-xml, roxmltree y serde_xml_rs
Cliente Elasticsearch para PHP: elasticsearch-php. Guía completa
gomock para Go: guía completa con ejemplos prácticos
Trabajo con CSV en Swift (iOS/macOS) — bibliotecas y ejemplos de código
Generador de códigos QR en C++ con libqrencode y CQRcode