• 【C#】解析和操作HTML文档,并进行同级或跨级匹配元素


    给自己一个目标,然后坚持一段时间,总会有收获和感悟!
    在前端,我们可以通过javascript操作元素,只要知道元素的class或id等属性值,学过jQuery的小伙伴,使用jQuery操作元素对象更加方便。
    如果是后端,那么又如何操作html的标签元素呢!刚开始博主没有用插件时,都是通过匹配进行解析,后来就是使用第三方插件,成熟稳定且可靠。
    此篇文章就简单讲讲第三方插件HtmlAgilityPack。

    在这里插入图片描述

    一、插件描述

    HtmlAgilityPack 是一个 C# 的开源库,它提供了解析和操作 HTML 文档的功能。它是一个非常流行的工具,可以在 C# 环境中轻松地处理 HTML 内容。

    使用 HtmlAgilityPack,你可以加载 HTML 文档,并使用 XPath 表达式来选择和操作文档中的元素。你可以通过 HtmlNode 对象访问 HTML 元素的属性、文本内容,或者修改 HTML 结构。

    HtmlAgilityPack 不仅适用于解析和操作 HTML 文档,它还可以处理 XML 文档,因为 HTML 文档实际上是符合 XML 格式的。

    要使用 HtmlAgilityPack,在你的 C# 项目中,你需要将 HtmlAgilityPack 库添加为依赖项。你可以通过 NuGet 包管理器将其添加到项目中,或者直接从 HtmlAgilityPack 的官方网站下载源代码并引用到你的项目中。

    以下是一个简单的示例,演示了如何在 C# 中使用 HtmlAgilityPack 解析 HTML 文档:

    using HtmlAgilityPack;
    
    string html = "

    Hello, World!

    "
    ; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); HtmlNode h1Node = doc.DocumentNode.SelectSingleNode("//h1"); if (h1Node != null) { string innerText = h1Node.InnerText; Console.WriteLine(innerText); // 输出 "Hello, World!" }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在上述示例中,我们通过导入 HtmlAgilityPack 命名空间,并使用 HtmlDocument 类创建一个 HTML 文档对象。然后我们使用 LoadHtml 方法加载 HTML 内容,并使用 XPath 表达式 //h1 选择

    元素。最后,我们获取选定元素的内部内容并输出。

    总之,HtmlAgilityPack 是一个流行的 C# 插件,可帮助你在应用程序中解析、操作和处理 HTML 文档和元素。

    二、插件使用

    要使用 C# 和 HtmlAgilityPack 加载 URL,可以按照以下步骤进行操作

    2.1.、安装插件

    首先,确保你已经将 HtmlAgilityPack 添加到你的项目中。你可以通过 NuGet 包管理器将其添加到你的项目。

    2.2、引入插件

    导入命名空间,以便在你的代码中使用 HtmlAgilityPack:

    using HtmlAgilityPack;
    
    • 1

    2.3、创建实例

    创建一个新的 HtmlWeb 实例,并使用它来加载指定的 URL:

    string url = "https://example.com";
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(url);
    
    • 1
    • 2
    • 3

    2.4、操作节点

    现在,你可以使用 HtmlAgilityPack 的各种方法和属性来处理加载的 HTML 文档。
    例如,你可以使用 doc.DocumentNode 来访问文档的根节点,然后使用 XPath 查询语言来选择特定的 HTML 元素。

    这里是一个示例,演示如何加载 URL 并从中提取所有链接:

    string url = "https://example.com";
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(url);
    
    // 使用 XPath 选择所有的链接元素
    HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
    
    if (linkNodes != null)
    {
        foreach (HtmlNode linkNode in linkNodes)
        {
            // 获取链接的 href 属性值
            string href = linkNode.GetAttributeValue("href", "");
    
            Console.WriteLine(href);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这只是一个简单示例,可以根据自己的需求进一步处理加载的 HTML 文档。

    三、xpath格式

    以下是 HtmlAgilityPack 中常见的 XPath 格式

    3.1、选择元素

    //tagname 或 //tagname[@attribute],其中 tagname 是元素的名称,attribute 是要匹配的属性。

    3.2、选择子元素

    .//tagname 或 .//tagname[@attribute],其中 . 表示当前元素。

    3.3、选择属性

    @attribute,其中 attribute 是要选择的属性名称。

    3.4、取出文本

    text()或者innerText

    3.5、取出 HTML:

    innerHTML()。

    3.6、匹配文本

    contains()。例如://tag[contains(text(),‘my text’)]。

    3.7、匹配属性值

    @attribute=‘value’。例如://tag[@class=‘myclass’]。

    3.5、选择元素

    1)第 n 个元素:
    //tagname[n],其中 n 是元素的索引,从 1 开始。
    2)选择第一个元素:
    (//tagname)[1]。
    3)选择最后一个元素:
    (//tagname)[last()]。

    以上是一些常见的 XPath 格式

    四、元素匹配

    双斜杠//表示跨级匹配,单斜杠/表示一级匹配

    4.1、多级匹配

    要在 HtmlAgilityPack 中使用多级元素匹配的 XPath 格式,你可以使用以下语法://a/b/c/d

    这将选择位于根节点下的任何 a 元素,并在其后代中查找匹配的 b 元素,然后在 b 元素的后代中查找匹配的 c 元素,最后在 c 元素的后代中查找匹配的 d 元素。

    以下示例演示如何使用多级元素匹配的 XPath 来选择 HTML 文档中嵌套的元素:

    string html = @"
    
        
            
        
    ";
    
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    
    HtmlNode targetNode = doc.DocumentNode.SelectSingleNode("//a/b/c/d");
    if (targetNode != null)
    {
        string innerText = targetNode.InnerText;
        Console.WriteLine(innerText); // 输出 "Target Element"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    该示例中的 HTML 文档包含了嵌套的标签结构,最终使用 XPath //a/b/c/d 来选择目标元素,并输出其内部文本。

    小伙伴们可以根据实际的 HTML 结构和需求,调整 XPath 表达式来匹配你想要选择的多级元素。

    4.2、跨级匹配

    是的,HtmlAgilityPack 中的 XPath 表达式可以跨层级匹配元素。

    要跨层级匹配元素,你可以使用双斜杠(//)运算符, 例如://div//span 将会选择文档中任何位置的 元素,它们的上级都是

    元素。

    以下是一个示例 HTML 文档:

    <html>
        <body>
            <div>
                <p>foop>
            div>
            <section>
                <div>
                    <span>barspan>
                div>
            section>
        body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果你想选择文档中所有的 元素,不管它们是否在

    元素内部,则可以使用如下代码:

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    
    foreach (HtmlNode span in doc.DocumentNode.SelectNodes("//span"))
    {
        string innerText = span.InnerText;
        Console.WriteLine(innerText);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这将匹配所有的 元素并输出其内部文本。注意 // 符号的使用。

    因此,在 HtmlAgilityPack 中,双斜杠的使用意味着跨越任意数量的层级来查找特定的元素。

  • 相关阅读:
    计算机未连接到互联网(win11系统)
    数据结构 - 数组 - 青岛大学(王卓)
    Java自动化驱动浏览器搜索稻香
    微服务 第一章 Java线程池技术应用
    Java23种设计模式之【单例模式】
    Bootstrap-- 栅格系统
    【Java】PAT Basic Level 1023 组个最小数
    ESP8266-Arduino编程实例-BH1745NUC亮度和颜色传感器驱动
    数据库驱动和JDBC
    springcloud配置nacos配置远程地址,连接一直执行127
  • 原文地址:https://blog.csdn.net/lmy_520/article/details/134438154