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

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

在这里插入图片描述

目录

  • 一、插件描述
  • 二、插件使用
    • 2.1.、安装插件
    • 2.2、引入插件
    • 2.3、创建实例
    • 2.4、操作节点
  • 三、xpath格式
    • 3.1、选择元素
  • 3.2、选择子元素
    • 3.3、选择属性
    • 3.4、取出文本
    • 3.5、取出 HTML:
    • 3.6、匹配文本
    • 3.7、匹配属性值
    • 3.5、选择元素
  • 四、元素匹配
    • 4.1、多级匹配
    • 4.2、跨级匹配

一、插件描述

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 = "<html><body><h1>Hello, World!</h1></body></html>";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!"
}

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

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

二、插件使用

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

2.1.、安装插件

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

2.2、引入插件

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

using HtmlAgilityPack;

2.3、创建实例

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

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

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

这只是一个简单示例,可以根据自己的需求进一步处理加载的 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 = @"
<html><body><div><a><b><c><d>Target Element</d></c></b></a></div></body>
</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"
}

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

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

4.2、跨级匹配

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

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

以下是一个示例 HTML 文档:

<html><body><div><p>foo</p></div><section><div><span>bar</span></div></section></body>
</html>

如果你想选择文档中所有的 <span> 元素,不管它们是否在 <div> 元素内部,则可以使用如下代码:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);foreach (HtmlNode span in doc.DocumentNode.SelectNodes("//span"))
{string innerText = span.InnerText;Console.WriteLine(innerText);
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/185792.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决SSH连接自动断开的问题

一、环境 centos7.6 xshell7 二、目标 ssh长联状态&#xff0c;不主动断开 三、实施 1.修改/etc/profile文件 末尾添加export TMOUT0 vim /etc/profileexport TMOUT02.修改/etc/ssh/sshd_config文件 默认都被注释掉&#xff0c;放开并设置CAI参数为0-60间 vim /etc…

基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)

一、前言 本项目是基于单片机设计的电子指南针&#xff0c;主要利用STC89C52作为主控芯片和LSM303DLH模块作为指南针模块。通过LCD1602液晶显示屏来展示检测到的指南针信息。 在日常生活中&#xff0c;指南针是一种非常实用的工具&#xff0c;可以帮助我们确定方向&#xff0…

vue 城市选择器的使用 element-china-area-data

一、Element UI 中国省市区级联数据 本文参考&#xff1a;element-china-area-data - npm 1. 安装 npm install element-china-area-data -S2. 使用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from e…

vs2017 编译Qt 5.11.2 源码

SDK 10.0.22000.194 有 2种编译方式 &#xff0c;第二种 看下面 推荐使用方式二&#xff0c;简单方便&#xff0c;唯一不好是慢 方式一: 1、问题描述&#xff1a; 使用VS编译程序时&#xff0c;运行库选择多线程&#xff08;/MT&#xff09;&#xff0c;表示采用多线程静态…

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件&#xff08;无论是个人照片还是重要业务文档&#xff09;的任何人来说&#xff0c;数据丢失都可能是一场噩梦。 值得庆幸的是&#xff0c;有多种数据恢复工具专门用于Mac用户&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

js实现tab栏切换

目录 1、排他思想实现 2、事件委托实现 1、排他思想实现 思路&#xff1a; 需要点击谁&#xff0c;就先获取谁&#xff0c;获得的是一个伪数组 遍历数组&#xff0c;并给数组里的每个元素添加点击事件&#xff0c;写一个active类用于显示边框样式 每一个元素对应一张图片&…

连新手小白都知道的电子画册一键生成器,你还不知道吗?

相信大家平时见得比较多的是纸质画册&#xff0c;而对于电子画册大家又了解多少呢&#xff1f;电子画册近年来倍受众多企业青睐&#xff0c;制作一本好的电子画册能够让企业在市场竞争中脱颖而出&#xff0c;给人以深刻印象。如何制作呢&#xff1f; 其实很简单&#xff0c;关…

电脑集中管理软件|局域网电脑集中管控怎么做

电脑集中管理软件|局域网电脑集中管控怎么做 电脑集中管理软件可以实现对员工工作情况的实时追踪&#xff0c;将工作效率情况采用可视化展示&#xff0c;管理者可根据图表发现员工工作效率低下的主要原因&#xff0c;并适当的调整&#xff0c;充分发挥员工的长处&#xff0c;从…

Python中表格插件Tabulate的用法

目录 一、引言 二、Tabulate插件安装与导入 三、Tabulate基本用法 1、创建表格&#xff1a; 2. 格式化表格&#xff1a; 3. 表格转置&#xff1a; 4、合并单元格&#xff1a; 5、指定每列的格式&#xff1a; 6、指定每行的格式&#xff1a; 7、使用自定义表格格式&am…

中级程序员——uniapp和小程序面试题

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;uniapp和小程序面试题 文章目录 用uniapp有遇到一些兼容性问题吗&#xff1f;uniapp最大的优点是什么&#xff1f;uniapp如何实现多端兼容&#xff1f;uniapp是如何做跨端适配的&#xff1f;常用的u…

Docker Desktop 配置阿里云镜像加速

阿里云搜索镜像&#xff0c;打开容器镜像服务&#xff0c;复制镜像加速器地址 Docker Desktop 右上角设置&#xff0c;选择 Docker Engine&#xff0c;在配置中添加阿里云的镜像地址&#xff0c;右下 Apply & restart 即可。 "registry-mirrors": ["https…