Парсинг HTML в C# (.NET): обзор библиотек HtmlAgilityPack и AngleSharp
Парсинг HTML — одна из ключевых задач при разработке веб-скраперов, анализаторов контента и инструментов для автоматизации. В экосистеме C# (.NET) существует несколько зрелых библиотек, которые позволяют извлекать данные из HTML-документов, манипулировать DOM-деревом и выполнять запросы к элементам. В этой статье мы подробно рассмотрим две самые популярные библиотеки: HtmlAgilityPack и AngleSharp, их возможности, синтаксис и примеры использования.
1. HtmlAgilityPack — проверенный временем инструмент
HtmlAgilityPack (HAP) — одна из старейших и наиболее распространённых библиотек для парсинга HTML в .NET. Она поддерживает как .NET Framework, так и .NET Core / .NET 5+. Основное преимущество — простота и отказоустойчивость при работе с «грязным» HTML (невалидная разметка, незакрытые теги).
Установка
// Через NuGet Package Manager
Install-Package HtmlAgilityPack
// Или через .NET CLI
dotnet add package HtmlAgilityPack
Базовый пример: извлечение заголовков H1
using HtmlAgilityPack;
string html = @"
<html>
<body>
<h1>Заголовок 1</h1>
<h1>Заголовок 2</h1>
<p>Текст параграфа</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());
}
}
// Вывод:
// Заголовок 1
// Заголовок 2
Использование XPath и CSS-селекторов
HtmlAgilityPack по умолчанию использует XPath для навигации. Однако с помощью пакета HtmlAgilityPack.CssSelectors можно применять CSS-селекторы:
// Установка: dotnet add package HtmlAgilityPack.CssSelectors
using HtmlAgilityPack.CssSelectors;
// ... после загрузки документа
var links = doc.DocumentNode.QuerySelectorAll("a.external-link");
foreach (var link in links)
{
Console.WriteLine(link.GetAttributeValue("href", ""));
}
Парсинг реального сайта
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);
// Извлекаем все заголовки статей
var 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 — современная альтернатива
AngleSharp — более молодая библиотека, которая предлагает полную поддержку HTML5, CSS3, JavaScript (ограниченно) и DOM-спецификаций. Она идеально подходит для задач, где требуется точное соответствие браузерному рендерингу. Поддерживает .NET Standard 2.0+, что означает совместимость с .NET Framework 4.6.1+ и .NET Core.
Установка
dotnet add package AngleSharp
Базовый пример: извлечение всех ссылок
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")}");
}
// Вывод:
// Example -> https://example.com
// Test -> https://test.com
Работа с атрибутами и вложенными элементами
// Парсинг таблицы
var tableHtml = @"
<table>
<tr><td>Имя</td><td>Возраст</td></tr>
<tr><td>Анна</td><td>25</td></tr>
<tr><td>Иван</td><td>30</td></tr>
</table>";
var doc = parser.ParseDocument Также в библиотеке
Prometheus метрики в Rust: библиотека prometheus и metrics-exporter-prometheus
Миграции баз данных в C# (.NET): Entity Framework, FluentMigrator и другие подходы
Redis клиент для TypeScript: ioredis и redis
Планировщик задач на C++: TaskFlow, CronCpp, Boost.Asio