Как использовать XPath – Evaluate() метод
XPath
XPath (XML Path Language) обеспечивает гибкий способ указания на различные части XML-документа с использованием синтаксиса, отличного от XML. Имя XPath происходит от выражения пути, которое обеспечивает средство иерархической адресации узлов в дереве документа. XPath – это язык запросов с множеством возможностей. XPath позволяет обрабатывать значения, соответствующие модели данных DOM; он основан на DOM-представлении HTML-документа и выбирает узлы по различным критериям. Выражения XPath также можно использовать в C и C++, JavaScript, XML-схеме, PHP, Python и многих других языках.
XPath в основном используется для навигации по модели DOM языкового документа на основе XML с использованием выражений XPath. Вы можете использовать XPath в HTML и SVG вместо того, чтобы полагаться на GetElement() или QuerySelectorAll() и другие функции DOM.
В этой статье рассказывается, как использовать метод Evaluate() для навигации по документу HTML и выбора узлов по XPath-запрос. Вы узнаете, как выбрать все фотографии из документа HTML, используя выражения XPath.
Вы можете загрузить файлы данных и полные примеры C#, демонстрирующие использование метода Evaluate() для запросов XPath, из GitHub.
Метод Evaluate()
Запросы XPath в основном выполняются с использованием
Evaluate() метода
Document класса. Метод Evaluate(expression
, contextNode
, resolver
, type
, result
) принимает выражение XPath и другие заданные параметры и возвращает результат указанного типа. Рассмотрим параметры метода:
expression
– это строковое представление XPath, которое нужно оценить.contextNode
указывает узел контекста для оценки выражения XPath. Обычно документ передается как узел контекста.resolver
разрешает перевод всех префиксов, включая префикс пространства имен xml, в выражении XPath в соответствующие URI пространства имен.type
соответствует типу возвращаемого XPathResult результата. Если указан конкретный тип, то результат будет возвращен как соответствующий тип.result
определяет конкретный объект результата, который может быть повторно использован и возвращен этим методом. null является наиболее распространенным и создаст новый XPathResult.
Запрос XPath – получение изображений с веб-страницы
Часто требуется сохранить большое количество изображений из разных сервисов, например фотографии из определенного альбома. Вручную это можно сделать, но это займет значительное количество времени. Таким образом, это долго и неэффективно, поэтому вы можете использовать библиотеку Aspose.HTML для автоматизации этого процесса. В этом примере вы узнаете, как найти ссылки на все нужные изображения на веб-странице, используя метод Evaluate() и выражение XPath. XPath – это мощный язык запросов, предоставляющий широкие возможности для настройки запросов. Давайте взглянем на HTML-документ xpath-image.htm. Он состоит из шапки и футера (header and footer), содержащих рекламные изображения, а также основного элемента, состоящего из рядов фотографий, перемежающихся рекламными баннерами.
Получить ссылки на все изображения в документе
Начнем с простого XPath-запроса для всех изображений в документе. Далее используется выражение XPath //img
. Он выбирает все элементы img
независимо от того, где они находятся в документе:
XPath Expression
1//img
C# code
1var result = doc.Evaluate("//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//img", document, null, XPathResult.ANY_TYPE, null);
Этот XPath-запрос вернет все ссылки на изображения (фотографии, баннеры) из header и footer, а также те, что находятся между рядами фотографий и среди них.
Избавьтесь от баннеров в header и footer
Для начала избавимся от баннеров в header и footer, есть много способов сделать это, но в данном примере мы поставим фильтрацию по родителю. Запрос XPath //main//img
возвращает все вложенные элементы //img
во все элементы //main
. Этот результат уже лучше подходит для запроса на получение фотографий из документа, но все еще содержит лишние баннеры.
XPath Expression
1//main//img
C# code
1var result = doc.Evaluate("//main//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main//img", document, null, XPathResult.ANY_TYPE, null);
Избавьтесь от некоторых баннеров в «основном» контейнере
На следующем шаге давайте избавимся от баннеров в четных дочерних элементах /div
контейнера main
. Это выражение XPath позволяет выбрать все дочерние элементы /div
, номер позиции которых даст остаток при делении на 2, то есть нечетный:
XPath Expression
1//main/div[position() mod 2 = 1]//img
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img", document, null, XPathResult.ANY_TYPE, null);
Итак, мы получили список, содержащий ссылки на фотографии и рекламные баннеры, расположенные во всех нечетных элементах div
, которые являются дочерними элементами контейнера main
.
Получить только ссылки на фотографии из документа HTML
Чтобы избавиться от рекламных баннеров, расположенных среди фотографий, выражение XPath должно включать имя класса изображения, потому что все фотографии в строках имеют соответствующий класс photo
:
XPath Expression
1//main/div[position() mod 2 = 1]//img[@class = 'photo']
C# code
1var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
JavaScript code
1var result = document.evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", document, null, XPathResult.ANY_TYPE, null);
В результате мы получили список, содержащий только ссылки на фотографии. Так что остается только их скачать.
Пример C#. Получить только ссылки на фотографии из HTML-документа
Давайте рассмотрим пример C# использования метода Evaluate() для выбора всех фотографий из HTML-документа с использованием выражений XPath. Вы должны выполнить несколько шагов:
- Загрузите существующий файл HTML ( xpath-image.htm).
- Используйте метод Evaluate() класса Document и передайте ему выражение XPath и другие параметры.
- Переберите полученные узлы и выведите их на консоль.
- Вы получите список, содержащий только ссылки на фотографии из HTML-документа.
1// Create an instance of an HTML document
2using (var doc = new HTMLDocument(Path.Combine(DataDir, "xpath-image.htm")))
3{
4 // Evaluate the XPath expression
5 var result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
6 // Iterate over the resulted nodes and print them to the console
7 Node node;
8 while ((node = result.IterateNext()) != null)
9 {
10 var img = (HTMLImageElement)node;
11 Console.WriteLine(img.Src);
12 }
13}
Aspose.HTML предлагает бесплатные Веб-приложения HTML, которые представляют собой онлайн-коллекцию конвертеров, слияний, загрузчиков, инструментов SEO, генераторов HTML-кода и многое другое. Приложения работают в любой операционной системе с веб-браузером и не требуют установки дополнительного программного обеспечения. Это быстрый и простой способ эффективно и действенно решать ваши задачи, связанные с HTML.