Парсинг 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 регулярками.
Также в библиотеке
Elasticsearch REST клиент для Kotlin: руководство по использованию
GraphQL в C++: библиотека cppgraphqlgen для создания API
JMH для Java: полное руководство с примерами
openapi-typescript для TypeScript: полное руководство с примерами
JWT токены в Rust: библиотека jsonwebtoken и работа с аутентификацией