如何使用 XPath – Evaluate() 方法

XPath

XPath(XML 路径语言)提供了一种灵活的方法,可以使用非 XML 语法指向基于 XML 文档的不同部分。XPath 的名称源于路径表达式,它提供了一种分层寻址文档树中节点的方法。XPath 是一种查询语言,具有多种可能性。XPath 允许处理符合 DOM 数据模型的值;它以 HTML 文档的 DOM 表示法为基础,通过各种标准选择节点。XPath 表达式还可用于 C 和 C++、JavaScript、XML Schema、PHP、Python 以及许多其他语言。

XPath 主要用于使用 XPath 表达式浏览基于 XML 语言文档的 DOM。您可以在 HTML 和 SVG 中使用 XPath,而不是依赖 GetElement()QuerySelectorAll() 方法和其他 DOM 函数。

本文介绍如何使用 Evaluate() 方法浏览 HTML 文档并通过 XPath 查询选择节点。您将学习如何使用 XPath 表达式从 HTML 文档中选择所有照片。

您可以从 GitHub 下载数据文件和完整的 C# 示例,这些示例演示了 XPath 查询中 Evaluate() 方法的使用。

评估()方法

XPath 查询主要使用 Document 类的 Evaluate() 方法。Evaluate(expression, contextNode, resolver, type, result) 方法接受一个 XPath 表达式和其他给定参数,并返回指定类型的结果。让我们来看看该方法的参数:

XPath 查询 – 从网页中获取图像

通常情况下,您希望保存来自不同服务的大量图像,例如某个相册中的照片。手动操作是可行的,但需要花费大量时间。因此,这既费时又低效,您可以使用 Aspose.HTML 库来自动完成这一过程。

在本例中,您将学习如何使用 Evaluate() 方法和 XPath 表达式查找网页上所有所需图片的链接。XPath 是一种功能强大的查询语言,可让您自由定制查询。让我们来看看 HTML 文档 xpath-image.htm。它包括包含广告图片的页眉和页脚,以及包含照片行和广告横幅的主元素。

获取文档中所有图像的链接

让我们从一个直接的 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 查询将返回页眉和页脚的所有图像(照片、横幅)链接,以及照片行之间和照片行之间的链接。

去除页眉和页脚的横幅广告

首先,让我们去掉页眉和页脚中的横幅,有很多方法可以做到这一点,但在本例中,我们将通过父级元素设置过滤。XPath 查询//main//img会返回所有//main元素内嵌套的所有//img元素。这个结果已经更适合从文档中获取照片的请求,但仍包含额外的横幅。

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

删除 “主 “容器中的一些横幅广告

下一步,让我们清除 main 容器的偶数 /div 子元素中的横幅。通过 XPath 表达式,您可以选择所有其位置编号除以 2 后余数为奇数的 /div 子元素:

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() 方法,使用 XPath 表达式从 HTML 文档中选择所有照片。您应遵循以下几个步骤

  1. 加载现有的 HTML 文件 ( xpath-image.htm)。
  2. 使用 Document 类的 Evaluate() 方法,并向其传递 XPath 表达式和其他参数。
  3. 遍历结果节点,并将其打印到控制台。
  4. 您将得到一个仅包含 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 网络应用程序,是转换器、合并器、搜索引擎优化工具、HTML 代码生成器、URL 工具等的在线集合。这些应用程序可在任何装有网络浏览器的操作系统上运行,无需安装任何其他软件。它是一种快速、简便的方法,能有效解决与 HTML 相关的任务。

文本 “HTML 网络应用程序”

Close
Loading

Analyzing your prompt, please hold on...

An error occurred while retrieving the results. Please refresh the page and try again.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.