Веб-скрейпинг с использованием C#

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

В этой статье должны быть раскрыты следующие темы:

C# API парсинга веб-страниц

Для парсинга веб-страниц из HTML-файлов или URL-адресов мы будем использовать API Aspose.HTML для .NET. Это расширенный API обработки HTML, который позволяет генерировать, изменять, извлекать данные, преобразовывать и отображать HTML-документы без какого-либо внешнего программного обеспечения. Пожалуйста, загрузите DLL API или установите его с помощью NuGet.

PM> Install-Package Aspose.Html

Чтение и извлечение HTML с помощью C#

Мы можем читать и извлекать HTML из любого HTML-документа, выполнив следующие шаги:

  1. Загрузите HTML-документ с помощью класса HTMLDocument.
  2. Отобразите внутренний HTML-код файла на консоли.

В следующем примере кода показано, как читать и извлекать содержимое HTML с помощью C#.

// В этом примере кода показано, как отобразить содержимое HTML-документа
// Загрузить HTML-документ
var document = new HTMLDocument(@"D:\Files\html\input.html");

// Показать внутренний HTML документа
Console.WriteLine(document.Body.InnerHTML);
Чтение и извлечение HTML с помощью C#.

Чтение и извлечение HTML с помощью C#.

Точно так же мы можем читать и извлекать HTML с действующих веб-сайтов, как показано ниже:

// В этом примере кода показано, как отобразить содержимое URL-адреса действующего веб-сайта.
// Инициализировать URL-адрес
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// Загрузить файл HTML, используя экземпляр URL
HTMLDocument document = new HTMLDocument(url);

// Показать внутренний HTML файла на консоль
Console.WriteLine(document.Body.InnerHTML);

Проверка элементов документа с помощью C#

Мы можем проверить документ и его элементы, выполнив следующие шаги:

  1. Загрузите HTML-документ с помощью класса HTMLDocument.
  2. Получите HTML-элемент документа.
  3. Получить первый/последний элементы элемента HTML.
  4. Отображение сведений об элементе, таких как TagName, TextContent.

В следующем примере кода показано, как проверять элементы документа с помощью C#.

// В этом примере кода показано, как проверять элементы HTML.
// Загрузить документ из файла
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// Получить html-элемент документа
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// Получить последний элемент элемента html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// Получить первый элемент элемента body
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

Найти определенный элемент с помощью фильтров в C#

Мы можем использовать настраиваемые фильтры, чтобы найти определенный элемент, например, получить все изображения, ссылки и т. д. Для этой цели API предоставляет интерфейс TreeWalker. Это позволяет перемещаться по дереву или поддереву документа, используя представление документа, определяемое их флагами whatToShow и фильтром (если есть). Мы можем найти определенные элементы с помощью фильтров, выполнив следующие шаги:

  1. Определите фильтры с помощью класса NodeFilter и переопределите метод AcceptNode().
  2. Загрузите HTML-документ с помощью класса HTMLDocument.
  3. Вызовите метод CreateTreeWalker(). Он принимает корневой узел, что показывать и NodeFilter в качестве аргументов.

В следующем примере кода показано, как найти определенные элементы с помощью C#.

// В этом примере кода показано, как запрашивать данные с помощью фильтров.
// Загрузите HTML-документ
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Чтобы начать HTML-навигацию, нам нужно создать экземпляр TreeWalker.
// Указанные параметры означают, что он начинает ходить с корня документа,
// итерация всех узлов и использование нашей пользовательской реализации фильтра
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // Поскольку мы используем собственный фильтр, текущий узел всегда будет экземпляром HTMLImageElement.
        // Таким образом, нам не нужны дополнительные проверки здесь.
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // вывод: image1.png
        // вывод: image2.png
    }
}
// В этом примере кода показано, как определить фильтр Node.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // Текущий фильтр пропускает все элементы, кроме элементов IMG.
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

Запрос данных из HTML с помощью C#

Мы также можем использовать XPath Query для запроса данных из HTML-документа, выполнив следующие шаги:

  1. Загрузите HTML-документ с помощью класса HTMLDocument.
  2. Вызовите метод Оценить(). Он принимает строку выражения XPath, документ и тип в качестве аргументов.
  3. Наконец, прокрутите полученные узлы и отобразите текст

В следующем примере кода показано, как запрашивать данные с помощью запросов XPath с помощью C#.

// В этом примере кода показано, как запрашивать данные с помощью запроса XPath.
// Подготовьте HTML-код
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Инициализировать документ на основе подготовленного кода
HTMLDocument document = new HTMLDocument(code, ".");

// Здесь мы оцениваем выражение XPath, где мы выбираем все дочерние элементы SPAN. 
// из элементов, чей атрибут «класс» равен «счастливому»:
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// Перебрать полученные узлы
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // вывод: привет
    // вывод: Мир!
}

Извлечь с помощью селектора CSS в C#

Мы также можем извлекать содержимое HTML с помощью селекторов CSS. Для этой цели API предоставляет метод QuerySelectorAll(), который позволяет перемещаться по HTML-документу и искать нужные элементы. Он принимает селектор запросов в качестве параметра и возвращает соответствующий NodeList всех элементов. Мы можем запросить с помощью селекторов CSS, выполнив следующие шаги:

  1. Загрузите HTML-документ с помощью класса HTMLDocument.
  2. Вызовите метод QuerySelectorAll(). Он принимает селектор запросов в качестве аргумента.
  3. Наконец, прокрутите полученный список элементов.

В следующем примере кода показано, как извлечь содержимое HTML с помощью селекторов CSS в C#.

// Инициализировать документ на основе подготовленного кода
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Здесь мы создаем селектор CSS, который извлекает все элементы div.
var elements = document.QuerySelectorAll("div");

// Перебрать полученный список элементов
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

Получить бесплатную лицензию

Попробуйте API без ознакомительных ограничений, запросив бесплатную временную лицензию.

Вывод

В этой статье мы узнали, как:

  • читать и извлекать содержимое HTML-документа с помощью C#;
  • проверять элементы документа и находить определенный элемент в HTML;
  • данные, специфичные для запроса, и извлечь данные с помощью CSS Selector.

Кроме того, вы можете узнать больше об Aspose.HTML для .NET API, используя документацию. В случае возникновения каких-либо неясностей, пожалуйста, свяжитесь с нами на форуме.

Смотрите также