Парсинг HTML в C# (.NET): библиотеки HtmlAgilityPack и AngleSharp

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Парсинг 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                    

Рекомендаций