Работа с библиотекой AngelSharp в C#

парсинг html http c# библиотека 

О библиотеке AngelSharp

Библиотека AngelSharp — это .NET-библиотека, предоставляющая удобные методы для работы с HTTP-запросами и обработки HTML. Она является портом популярной JavaScript-библиотеки axios на платформу .NET.

Основные возможности AngelSharp включают:

  1. Отправка HTTP-запросов: Поддержка GET, POST, PUT, DELETE и других типов запросов.
  2. Обработка ответов: Удобное управление ответами от сервера, включая чтение заголовков, статусов и содержимого.
  3. Конфигурация запросов: Возможность настройки заголовков, тайм-аутов и других параметров запроса.
  4. Интерсепторы: Возможность добавлять перехватчики запросов и ответов для их изменения или обработки перед выполнением или после получения ответа.

Пример простого использования библиотеки AngelSharp для отправки GET-запроса и обработки ответа может выглядеть так:

using AngleSharp;
using AngleSharp.Io;

class Program
{
    static async Task Main(string[] args)
    {
        // Создаем конфигурацию для AngleSharp
        var config = Configuration.Default.WithDefaultLoader();

        // Создаем контекст с использованием конфигурации
        var context = BrowsingContext.New(config);

        // Отправляем GET-запрос и получаем документ
        var document = await context.OpenAsync("https://example.com");

        // Обрабатываем ответ
        var title = document.Title;
        Console.WriteLine("Title: " + title);
    }
}

В этом примере используется AngleSharp для создания контекста и отправки HTTP-запроса, а также для обработки HTML-документа. Это позволяет легко интегрировать HTTP-запросы и парсинг HTML в одном приложении.

Отправка GET запроса

Давайте рассмотрим пример кода на C# с использованием библиотеки AngelSharp для отправки GET-запроса, получения ответа и сохранения куки-файлов в файл.

Пример кода будет включать:

  1. Отправку GET-запроса.
  2. Извлечение куки из ответа.
  3. Сохранение куки в файл.
using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Io;
using AngleSharp.Io.Network;
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // Создаем конфигурацию для AngleSharp с поддержкой обработки cookie
        var config = Configuration.Default.WithDefaultLoader().WithCookies();

        // Создаем контекст с использованием конфигурации
        var context = BrowsingContext.New(config);

        // URL для отправки запроса
        var url = "https://example.com";

        // Отправляем GET-запрос и получаем документ
        var document = await context.OpenAsync(url);

        // Получаем куки из менеджера куки в конфигурации
        var cookieManager = context.GetService<ICookieProvider>();

        // Получаем все куки для домена
        var cookies = cookieManager.GetAllCookies(new Url(url));

        // Форматируем куки в строку для сохранения
        var cookieString = string.Join(Environment.NewLine, cookies);

        // Путь к файлу для сохранения куки
        var cookieFilePath = "cookies.txt";

        // Сохраняем куки в файл
        await File.WriteAllTextAsync(cookieFilePath, cookieString);

        Console.WriteLine($"Куки сохранены в файл: {cookieFilePath}");
    }
}

В этом примере:

  1. Мы создаем конфигурацию Configuration.Default.WithDefaultLoader().WithCookies(), которая включает загрузчик по умолчанию и поддержку куки.
  2. Создаем контекст BrowsingContext с этой конфигурацией.
  3. Отправляем GET-запрос к указанному URL с помощью context.OpenAsync(url).
  4. Извлекаем куки с помощью ICookieProvider из контекста.
  5. Сохраняем куки в файл cookies.txt.

Чтобы отправить GET-запрос с использованием сохраненных в файле cookies, можно выполнить следующие шаги:

  1. Прочитать куки из файла.
  2. Настроить HTTP-запрос с использованием этих куки.

Ниже приведен пример кода, который показывает, как это сделать:

using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Io;
using AngleSharp.Io.Network;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // Путь к файлу с куки
        var cookieFilePath = "cookies.txt";

        // Чтение куки из файла
        var cookieLines = await File.ReadAllLinesAsync(cookieFilePath);

        // Создание словаря для хранения куки
        var cookies = new Dictionary<string, string>();
        foreach (var line in cookieLines)
        {
            var parts = line.Split(new[] { '=' }, 2);
            if (parts.Length == 2)
            {
                cookies[parts[0].Trim()] = parts[1].Trim();
            }
        }

        // URL для отправки запроса
        var url = "https://example.com";

        // Создание конфигурации с куки
        var config = Configuration.Default
            .WithDefaultLoader()
            .WithCookies(new CookieProvider(cookies));

        // Создание контекста с использованием конфигурации
        var context = BrowsingContext.New(config);

        // Отправка GET-запроса и получение документа
        var document = await context.OpenAsync(url);

        // Вывод заголовка страницы в консоль
        var title = document.Title;
        Console.WriteLine("Title: " + title);
    }

    // Класс для управления куки
    class CookieProvider : ICookieProvider
    {
        private readonly IDictionary<string, string> _cookies;

        public CookieProvider(IDictionary<string, string> cookies)
        {
            _cookies = cookies;
        }

        public void Dispose() { }

        public IEnumerable<ICookie> GetAllCookies()
        {
            foreach (var kvp in _cookies)
            {
                yield return new Cookie(kvp.Key, kvp.Value);
            }
        }

        public IEnumerable<ICookie> GetAllCookies(Url url)
        {
            return GetAllCookies();
        }

        public void SetCookie(Url url, ICookie cookie) { }
    }
}

В этом примере:

  1. Читаются куки из файла cookies.txt.
  2. Сохраняются куки в словаре Dictionary<string, string>.
  3. Создается конфигурация Configuration.Default.WithDefaultLoader().WithCookies(new CookieProvider(cookies)), где CookieProvider — пользовательский класс, реализующий интерфейс ICookieProvider.
  4. Отправляется GET-запрос с использованием этих куки.

Такой подход позволяет включить куки в запрос и обработать ответ.

Работа с DOM деревом HTML

Библиотека AngleSharp предоставляет множество методов и классов для разбора HTML данных. Основные методы и классы включают:

  1. Парсинг HTML-документов:

    • context.OpenAsync(url): Загружает и парсит HTML-документ из указанного URL.
    • context.OpenAsync(req): Загружает и парсит HTML-документ из запроса IRequest.
  2. Навигация по DOM:

    • document.QuerySelector(query): Возвращает первый элемент, соответствующий CSS-селектору.
    • document.QuerySelectorAll(query): Возвращает все элементы, соответствующие CSS-селектору.
    • element.QuerySelector(query): Возвращает первый дочерний элемент, соответствующий CSS-селектору.
    • element.QuerySelectorAll(query): Возвращает все дочерние элементы, соответствующие CSS-селектору.
    • document.GetElementById(id): Возвращает элемент с указанным ID.
    • document.GetElementsByClassName(className): Возвращает элементы с указанным классом.
    • document.GetElementsByTagName(tagName): Возвращает элементы с указанным тегом.
  3. Манипуляция DOM:

    • element.TextContent: Получает или задает текстовое содержимое элемента.
    • element.InnerHtml: Получает или задает HTML-содержимое элемента.
    • element.SetAttribute(name, value): Устанавливает атрибут элемента.
    • element.GetAttribute(name): Получает значение атрибута элемента.
    • element.RemoveAttribute(name): Удаляет атрибут элемента.
    • element.AppendChild(node): Добавляет дочерний узел к элементу.
    • element.RemoveChild(node): Удаляет дочерний узел из элемента.
  4. Работа с узлами:

    • document.CreateElement(tagName): Создает новый элемент с указанным тегом.
    • document.CreateTextNode(text): Создает новый текстовый узел.
    • document.ImportNode(node, deep): Импортирует узел из другого документа.
  5. Дополнительные методы и свойства:

    • element.ParentElement: Возвращает родительский элемент.
    • element.Children: Возвращает коллекцию дочерних элементов.
    • element.NextElementSibling: Возвращает следующий элемент-сосед.
    • element.PreviousElementSibling: Возвращает предыдущий элемент-сосед.

Пример использования некоторых из этих методов:

using AngleSharp;
using AngleSharp.Dom;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // Создаем конфигурацию для AngleSharp
        var config = Configuration.Default.WithDefaultLoader();

        // Создаем контекст с использованием конфигурации
        var context = BrowsingContext.New(config);

        // URL для загрузки
        var url = "https://example.com";

        // Загружаем и парсим HTML-документ
        var document = await context.OpenAsync(url);

        // Навигация по DOM
        var titleElement = document.QuerySelector("title");
        var headings = document.QuerySelectorAll("h1, h2, h3");

        // Вывод данных в консоль
        Console.WriteLine("Title: " + titleElement.TextContent);
        foreach (var heading in headings)
        {
            Console.WriteLine("Heading: " + heading.TextContent);
        }

        // Манипуляция DOM
        var newParagraph = document.CreateElement("p");
        newParagraph.TextContent = "This is a new paragraph.";
        document.Body.AppendChild(newParagraph);

        // Вывод обновленного HTML
        Console.WriteLine("Updated HTML: " + document.DocumentElement.OuterHtml);
    }
}

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

 

О сайте

Парсинг данных. Как собирать, извлекать, структурировать и анализировать данные

Соцсети

  1. ВКонтакте
  2. Telegram