C# 中的 HTML 导航

使用 Aspose.HTML for .NET库,您可以轻松创建自己的应用程序,因为我们的应用程序接口提供了一个强大的工具集,用于分析和收集 HTML 文档中的信息。

本文介绍了如何使用 Aspose.HTML for .NET API 以编程方式从 HTML 文档中提取数据。您将了解到

HTML 导航

Aspose.Html.Dom 命名空间提供了表示 HTML、XML 或 SVG 文档并与之交互的 API,它完全基于许多现代浏览器支持的 WHATWG DOM 规范。DOM 是在浏览器中加载的文档模型,以节点树的形式表示文档,其中每个节点都代表文档的一部分(如元素、文本字符串或注释)。

我们将讨论 DOM 如何在内存中表示 HTML 文档,以及如何使用 API 在 HTML 文件中进行导航。有许多方法可用于 HTML 导航。下面列出了访问所有 DOM 元素的最简单方法:

PropertyDescription
FirstChildAccessing this property of an element must return a reference to the first child node.
LastChildAccessing this property of an element must return a reference to the last child node
NextSiblingAccessing this property of an element must return a reference to the sibling node of that element which most immediately follows that element.
PreviousSiblingAccessing this property of an element must return a reference to the sibling node of that element which most immediately precedes that element.
ChildNodesReturns a list that contains all children of that element.

Node类属性中有四个属性–FirstChild、LastChild、NextSibling 和 PreviousSibling,每个属性都提供了对另一个元素的实时引用,如果相关元素与当前元素存在定义的关系的话。有关 Aspose.Html.Dom 命名空间中代表的类和方法的完整列表,请访问 API Reference Source

使用上述属性,您可以浏览 HTML 文档,如下所示:

 1// Navigate the HTML DOM using C#
 2
 3// Prepare HTML code
 4string html_code = "<span>Hello,</span> <span>World!</span>";
 5
 6// Initialize a document from the prepared code
 7using (HTMLDocument document = new HTMLDocument(html_code, "."))
 8{
 9    // Get the reference to the first child (first <span>) of the <body>
10    Node element = document.Body.FirstChild;
11    Console.WriteLine(element.TextContent); // output: Hello,
12
13    // Get the reference to the whitespace between html elements
14    element = element.NextSibling;
15    Console.WriteLine(element.TextContent); // output: ' '
16
17    // Get the reference to the second <span> element
18    element = element.NextSibling;
19    Console.WriteLine(element.TextContent); // output: World!
20
21    // Set an html variable for the document 
22    string html = document.DocumentElement.OuterHTML;
23
24    Console.WriteLine(html); // output: <html><head></head><body><span>Hello,</span> <span>World!</span></body></html>
25}

检查 HTML

Aspose.HTML 包含一系列基于 元素遍历规范的方法。您可以使用该 API 对文档及其元素进行详细检查。以下代码示例展示了元素遍历功能的一般用法。

 1// Access and navigate HTML elements in a document using C#
 2
 3// Load a document from a file
 4string documentPath = Path.Combine(DataDir, "html_file.html");
 5
 6using (HTMLDocument document = new HTMLDocument(documentPath))
 7{
 8    // Get the html element of the document
 9    Element element = document.DocumentElement;
10    Console.WriteLine(element.TagName); // HTML
11
12    // Get the last element of the html element
13    element = element.LastElementChild;
14    Console.WriteLine(element.TagName); // BODY
15
16    // Get the first element in the body element
17    element = element.FirstElementChild;
18    Console.WriteLine(element.TagName); // H1
19    Console.WriteLine(element.TextContent); // Header 1
20}

注意: 您需要指定 HTML 源文件在本地文件系统中的路径(“documentPath”)。

通过 Document 类的 DocumentElement 属性,可以直接访问文档中的 <html> 元素( html_file.html)。Document 类的 LastElementChild 属性返回 <html> 元素的最后一个子元素。它就是 <body> 元素。根据上面的代码片段,变量 element 再次被重载,FirstElementChild 属性返回 <body> 元素的第一个子元素。它就是 <h1> 元素。

自定义过滤器的使用

对于更复杂的情况,如果需要根据特定模式查找节点(例如,获取标题、链接等列表),可以使用专门的 TreeWalkerNodeIterator 对象,并自定义 Filter 实现。

下面的示例展示了如何实现自己的 NodeFilter,以跳过除图像之外的所有元素:

 1// Filter only <img> elements in HTML tree using C#
 2
 3class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
 4{
 5    public override short AcceptNode(Node n)
 6    {
 7        // The current filter skips all elements, except IMG elements
 8        return string.Equals("img", n.LocalName)
 9            ? FILTER_ACCEPT
10            : FILTER_SKIP;
11    }
12}

使用过滤器后,就可以按如下方式使用 HTML 导航:

 1// Implement NodeFilter to skip all elements except images
 2
 3// Prepare HTML code
 4string code = @"
 5    <p>Hello,</p>
 6    <img src='image1.png'>
 7    <img src='image2.png'>
 8    <p>World!</p>";
 9
10// Initialize a document based on the prepared code
11using (HTMLDocument document = new HTMLDocument(code, "."))
12{
13    // To start HTML navigation, we need to create an instance of TreeWalker
14    // The specified parameters mean that it starts walking from the root of the document, iterating all nodes and using our custom implementation of the filter
15    using (ITreeWalker iterator = document.CreateTreeWalker(document, NodeFilter.SHOW_ALL, new OnlyImageFilter()))
16    {
17        while (iterator.NextNode() != null)
18        {
19            // Since we are using our own filter, the current node will always be an instance of the HTMLImageElement
20            // So, we don't need the additional validations here
21            HTMLImageElement image = (HTMLImageElement)iterator.CurrentNode;
22
23            Console.WriteLine(image.Src);
24            // output: image1.png
25            // output: image2.png
26
27            // Set an html variable for the document 
28            string html = document.DocumentElement.OuterHTML;
29        }
30    }
31}

XPath 查询

XPath 查询( XML 路径语言)是HTML 导航的替代方法,通常简称为 XPath。它是一种查询语言,可用来查询 HTML 文档中的数据。它基于 HTML 文档的 DOM 表示法,并根据各种标准选择节点。XPath 表达式的语法非常简单,更重要的是,它易于阅读和支持。

下面的示例展示了如何在 Aspose.HTML API 中使用 XPath 查询:

 1// How to use XPath to select nodes using C#
 2
 3// Prepare HTML code
 4string code = @"
 5    <div class='happy'>
 6        <div>
 7            <span>Hello,</span>
 8        </div>
 9    </div>
10    <p class='happy'>
11        <span>World!</span>
12    </p>
13";
14
15// Initialize a document based on the prepared code
16using (HTMLDocument document = new HTMLDocument(code, "."))
17{
18    // Here we evaluate the XPath expression where we select all child <span> elements from elements whose 'class' attribute equals to 'happy':
19    IXPathResult result = document.Evaluate("//*[@class='happy']//span",
20        document,
21        null,
22        XPathResultType.Any,
23        null);
24
25    // Iterate over the resulted nodes
26    for (Node node; (node = result.IterateNext()) != null;)
27    {
28        Console.WriteLine(node.TextContent);
29        // output: Hello,
30        // output: World!
31    }
32}

文章 如何在 HTML 中使用 XPath 查询 – Evaluate() 方法 介绍了如何使用 Evaluate() 方法浏览 HTML 文档并根据各种条件选择节点。通过 C# 示例,您将了解如何使用 XPath 查询选择具有指定名称的所有节点。

CSS 选择器

除了 HTML NavigationXPath,您还可以使用我们的库同样支持的 CSS Selector API。该 API 可根据 CSS 选择器 语法创建搜索模式,以匹配文档树中的元素。

在下面的示例中,我们使用 QuerySelectorAll() 方法浏览 HTML 文档并搜索所需的元素。该方法将查询选择器作为参数,并返回一个包含所有符合指定选择器的元素的 NodeList。

 1// Extract nodes Using CSS selector in C#
 2
 3// Prepare HTML code
 4string code = @"
 5    <div class='happy'>
 6        <div>
 7            <span>Hello,</span>
 8        </div>
 9    </div>
10    <p class='happy'>
11        <span>World!</span>
12    </p>
13";
14
15// Initialize a document based on the prepared code
16using (HTMLDocument document = new HTMLDocument(code, "."))
17{
18    // Here we create a CSS Selector that extracts all elements whose 'class' attribute equals 'happy' and their child <span> elements
19    NodeList elements = document.QuerySelectorAll(".happy span");
20
21    // Iterate over the resulted list of elements
22    foreach (HTMLElement element in elements)
23    {
24        Console.WriteLine(element.InnerHTML);
25        // output: Hello,
26        // output: World!
27    }
28}

另见

  • 有关如何有效应用选择器来选择要样式化的元素的更多信息,请访问文章 CSS 选择器。您将学习基本选择器、组合选择器、属性选择器、组选择器和伪选择器。

  • 如何使用 CSS 选择器 – QuerySelector() 和 QuerySelectorAll() 这篇文章中,你将学习如何有效地应用选择器来选择想要样式的元素。QuerySelector() 和 QuerySelectorAll() 是用于查询与 CSS 选择器匹配的 DOM 元素的方法。

  • 您可以从 GitHub 下载完整的 C# 示例和数据文件。

  • Aspose.HTML 提供免费的在线 HTML 网络应用程序,是转换器、合并器、搜索引擎优化工具、HTML 代码生成器、URL 工具等的在线集合。这些应用程序可在任何装有网络浏览器的操作系统上运行,无需安装任何其他软件。无论你身在何处,都能轻松转换、合并、编码、生成 HTML 代码,从网络中提取数据,或从搜索引擎优化的角度分析网页。使用我们的 HTML 网络应用程序集来处理您的日常事务,让您的工作流程天衣无缝!

文本 “HTML 网络应用程序”

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.