Веб-парсер C#

Веб-скрейпинг, также известный как веб-сканирование, веб-сбор или сбор данных, используется для извлечения данных с веб-сайтов. Веб-скрапер использует различные селекторы данных, такие как селекторы CSS, XPath или и то, и другое, для извлечения данных с веб-страниц. Оба этих селектора эффективны для сбора и анализа информации из Интернета. В этой статье рассказывается, как создать веб-скребок на C#, в частности, информация о навигации по HTML, XPath Query и CSS Selector.

Конфигурация библиотеки веб-скрейпинга C#

Aspose.HTML для .NET — это библиотека веб-скрейпинга, которую можно легко настроить, загрузив эталонные DLL-файлы из раздела Новые выпуски или выполнив следующую команду установки NuGet. :

PM> Install-Package Aspose.Html

Веб-скрейпинг с HTML-навигацией в C#

Вы можете использовать различные свойства класса Node для навигации по документам HTML. Фрагмент кода ниже объясняет, как перемещаться по веб-странице HTML в C#:

// Подготовить HTML-код
var html_code = "<span>Hello</span> <span>World!</span>";

// Инициализировать документ из подготовленного кода
using (var document = new Aspose.Html.HTMLDocument(html_code, "."))
{
    // Получить ссылку на первый дочерний элемент (первый SPAN) BODY
    var element = document.Body.FirstChild;
    Console.WriteLine(element.TextContent); // output: Hello

    // Получить ссылку на пробел между элементами html
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: ' '

    // Получить ссылку на второй элемент SPAN
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: World!
}

Проверка HTML-документа и его элементов

API также обеспечивает обобщенное использование функций обхода элементов. В следующем фрагменте кода показано, как выполнить детальную проверку различных элементов API.

//Загрузить документ из файла
string documentPath = System.IO.Path.Combine(DataDir, "html_file.html");

// Укажите путь к исходному HTML-файлу в вашей локальной файловой системе.
using (var document = new Aspose.Html.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#

Пользовательский фильтр можно реализовать с помощью объекта интерфейса ITreeWalker или INodeIterator вместе с реализацией пользовательского фильтра. Следующий фрагмент кода объясняет, как выполнить этот процесс:

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;
    }
}

После внедрения пользовательского фильтра вы можете быстро перемещаться по веб-странице с помощью следующего кода:

var code = @"
    <p>Hello</p>
    <img src='image1.png'>
    <img src='image2.png'>
    <p>World!</p>";

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

            System.Console.WriteLine(image.Src);
            // вывод: image1.png
            // вывод: image2.png
        }
    }
}

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

XPath можно использовать для извлечения данных из HTML-документов. В следующем фрагменте кода показано, как использовать XPath Query для веб-скрейпинга в C#:

// Подготовить HTML-код
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Инициализировать документ на основе подготовленного кода
using (var document = new Aspose.Html.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#

Вы можете создать шаблон поиска для сопоставления элементов в дереве документа на основе синтаксиса селекторов CSS. В приведенном ниже фрагменте кода объясняется, как выполнять парсинг веб-страниц с помощью CSS Selector в C#:

// Подготовить HTML-код
var code = @"
    <div class='happy'>
        <div>
            <span>Hello</span>
        </div>
    </div>
    <p class='happy'>
        <span>World!</span>
    </p>
";

// Инициализировать документ на основе подготовленного кода
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // Здесь мы создаем селектор CSS, который извлекает все элементы, чей атрибут «класс» равен «счастливому», и их дочерние элементы SPAN.
    var elements = document.QuerySelectorAll(".happy span");

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

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

Вы можете запросить бесплатную временную лицензию для полной оценки API.

Вывод

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

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