Парсинг 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 отлично справ
Также в библиотеке
Prometheus метрики в Go: создание и экспорт метрик в Golang
Rocket для Rust: полное руководство с примерами
CLI фреймворки для PHP: создание консольных приложений с Symfony Console и Laravel Zero
Парсинг HTML в C# (.NET): обзор библиотек и примеры кода
Работа с изображениями в Rust: обзор библиотек image, fast_image_resize и others