Как использовать 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//imgC# 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//imgC# 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]//imgC# 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// Use XPath to get only links to photos from HTML
2
3// Create an instance of an HTML document
4using (HTMLDocument doc = new HTMLDocument(Path.Combine(DataDir, "xpath-image.htm")))
5{
6 // Evaluate the XPath expression
7 IXPathResult result = doc.Evaluate("//main/div[position() mod 2 = 1]//img[@class = 'photo']", doc, doc.CreateNSResolver(doc), XPathResultType.Any, null);
8 // Iterate over the resulted nodes and print them to the console
9 Node node;
10 while ((node = result.IterateNext()) != null)
11 {
12 HTMLImageElement img = (HTMLImageElement)node;
13 Console.WriteLine(img.Src);
14 }
15}Aspose.HTML предлагает бесплатные Приложения HTML, которые представляют собой онлайн-коллекцию конвертеров, слияний, загрузчиков, инструментов SEO, генераторов HTML-кода и многое другое. Приложения работают в любой операционной системе с веб-браузером и не требуют установки дополнительного программного обеспечения. Это быстрый и простой способ эффективно и действенно решать ваши задачи, связанные с HTML.
