Парсинг HTML в C# (.NET): обзор библиотек и примеры кода

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

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

Начать курс

Парсинг HTML в C# (.NET): от простого к сложному

Парсинг HTML — одна из ключевых задач при разработке веб-скраперов, анализаторов контента и инструментов автоматизации. В экосистеме C# (.NET) существует несколько зрелых библиотек, которые позволяют эффективно извлекать данные из HTML-документов, даже если разметка невалидна. В этой статье мы рассмотрим три самых популярных инструмента: HtmlAgilityPack, AngleSharp и CsQuery, а также разберём практические примеры их использования.

1. HtmlAgilityPack — классический выбор

HtmlAgilityPack (HAP) — это самая распространённая библиотека для парсинга HTML в C#. Она поддерживает XPath и LINQ, что делает её идеальной для работы с иерархическими структурами. HAP автоматически исправляет некорректную HTML-разметку, что особенно полезно при парсинге "сырых" страниц.

Установка через NuGet:

Install-Package HtmlAgilityPack

Пример: извлечение всех ссылок со страницы

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}");
    }
}

Пример: извлечение данных из таблицы

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 — современная альтернатива

AngleSharp — это более современная библиотека, полностью написанная на C# и соответствующая спецификациям W3C. Она поддерживает CSS-селекторы, что делает её удобной для тех, кто привык к jQuery-подобному синтаксису. AngleSharp также умеет работать с DOM, SVG и MathML.

Установка через NuGet:

Install-Package AngleSharp

Пример: парсинг с использованием CSS-селекторов

using AngleSharp;
using AngleSharp.Dom;

var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
var document = await context.OpenAsync("https://example.com");

// Получаем все элементы с классом "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}");
}

Пример: извлечение JSON из скрипта

var scripts = document.QuerySelectorAll("script[type='application/ld+json']");
foreach (var script in scripts)
{
    var json = script.TextContent;
    // Далее можно десериализовать JSON через System.Text.Json
    Console.WriteLine(json);
}

3. CsQuery — jQuery-подобный синтаксис

CsQuery — это порт jQuery для C#, который предоставляет знакомый API для работы с DOM. Он особенно удобен для тех, кто мигрирует с JavaScript на C#. Однако стоит отметить, что проект обновляется реже, чем AngleSharp, и может не поддерживать последние версии .NET.

Установка через NuGet:

Install-Package CsQuery

Пример: извлечение текста из элементов

using CsQuery;

string html = "<div class='content'><p>Привет, мир!</p></div>";
var dom = CQ.Create(html);

var text = dom[".content p"].Text();
Console.WriteLine(text); // Выведет: Привет, мир!

4. Практические советы по парсингу

  • Обработка ошибок: всегда оборачивайте парсинг в try-catch, особенно при работе с сетью. HtmlAgilityPack и AngleSharp могут выбросить исключения при некорректной разметке.
  • Кэширование: для уменьшения нагрузки на сервер сохраняйте HTML-страницы локально. Используйте File.ReadAllText() для загрузки из файла.
  • Асинхронность: AngleSharp поддерживает async/await из коробки. Для HAP используйте HttpClient для загрузки HTML и затем передавайте строку в HtmlDocument.LoadHtml().
  • Регулярные выражения: не пытайтесь парсить HTML регулярками.

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