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

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

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

Начать курс

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

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

HtmlAgilityPack: классический подход

HtmlAgilityPack (HAP) — это старейшая и наиболее распространённая библиотека для парсинга HTML в .NET. Она предоставляет интуитивно понятный API для навигации по DOM-дереву, поддерживает XPath и LINQ-запросы. Основные возможности:

  • Загрузка HTML из строки, файла или URL.
  • Поддержка XPath 1.0 для точного поиска элементов.
  • Работа с атрибутами, текстом и вложенными узлами.
  • Автоматическое исправление некорректного HTML (например, незакрытых тегов).

Установка

Установите библиотеку через NuGet:

Install-Package HtmlAgilityPack

Или через .NET CLI:

dotnet add package HtmlAgilityPack

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

Допустим, нам нужно спарсить заголовки с новостного сайта. Вот как это сделать с помощью HAP и XPath:

using HtmlAgilityPack;
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // Загружаем HTML-документ
        var web = new HtmlWeb();
        var doc = web.Load("https://example-news.com");
        
        // Выбираем все заголовки h2 с классом "news-title"
        var titles = doc.DocumentNode
            .SelectNodes("//h2[@class='news-title']");
        
        if (titles != null)
        {
            foreach (var title in titles)
            {
                Console.WriteLine(title.InnerText.Trim());
            }
        }
    }
}

В этом примере мы используем XPath-выражение //h2[@class='news-title'], чтобы найти все элементы <h2> с указанным классом. Метод SelectNodes возвращает коллекцию узлов, а InnerText извлекает текст без HTML-тегов.

Работа с атрибутами

Часто нужно получить значение атрибута, например, ссылки из тегов <a>:

var links = doc.DocumentNode.SelectNodes("//a[@href]");
if (links != null)
{
    foreach (var link in links)
    {
        string href = link.GetAttributeValue("href", "");
        Console.WriteLine(href);
    }
}

AngleSharp: современный парсер с CSS-селекторами

AngleSharp — это более современная библиотека, которая поддерживает не только XPath, но и CSS-селекторы, что делает её удобной для разработчиков, знакомых с веб-технологиями. Она также полностью соответствует стандартам W3C и может работать с динамическим контентом.

  • Поддержка CSS-селекторов (как в jQuery).
  • Работа с HTML, XML, SVG и MathML.
  • Возможность выполнения JavaScript (через расширения).
  • Асинхронная загрузка документов.

Установка

dotnet add package AngleSharp

Пример: извлечение данных с помощью CSS-селекторов

Повторим предыдущий пример, но теперь с AngleSharp и CSS-селекторами:

using AngleSharp;
using AngleSharp.Html.Parser;
using System;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // Создаём парсер
        var parser = new HtmlParser();
        
        // Загружаем HTML (можно из строки или URL)
        var document = await parser.ParseDocumentAsync(
            await new HttpClient().GetStringAsync("https://example-news.com"));
        
        // Используем CSS-селектор для поиска заголовков
        var titles = document.QuerySelectorAll("h2.news-title");
        
        foreach (var title in titles)
        {
            Console.WriteLine(title.TextContent.Trim());
        }
    }
}

Обратите внимание: метод QuerySelectorAll принимает CSS-селектор h2.news-title, что гораздо короче и привычнее для веб-разработчиков. Также AngleSharp возвращает IElement, у которого есть свойство TextContent.

Работа с вложенными структурами

AngleSharp отлично справ

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