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

news/2024/9/22 1:43:31/文章来源:https://www.cnblogs.com/raincedar/p/18398900

 

 

一、插件描述
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!"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
在上述示例中,我们通过导入 HtmlAgilityPack 命名空间,并使用 HtmlDocument 类创建一个 HTML 文档对象。然后我们使用 LoadHtml 方法加载 HTML 内容,并使用 XPath 表达式 //h1 选择 <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 = @"
<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"
}

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 来选择目标元素<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>
1
2
3
4
5
6
7
8
9
10
11
12
如果你想选择文档中所有的 <span> 元素,不管它们是否在 <div> 元素内部,则可以使用如下代码:

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

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

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

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

相关文章

word中的公式编号

一、给word自带的编辑器的公式加编号 https://blog.csdn.net/Flag_ing/article/details/112966671 方法1:最简单粗暴的方式 在公式输入的最后加上#和标号然后回车,比如下面:回车后的效果如下:方法2:稍微麻烦点 不建议看这个,因为这个哔哔一堆效果跟方法一是一样的哈哈哈,…

AI数字实时互动新探索,打造高拟真专属AI智能体

10分钟构建企业专属「云上智能体」我们打造了一款满足想象与应用的智能体——AI实时互动。 谈谈AI智能体当AI变得足够聪明时,用户与AI的交互将变得真实自然。于是,构建高拟真AI与用户的实时交互,已经成为企业提升数智化生产力的新思路。 在这个交互过程中,存在一个极具活力…

精细化管理|AIRIOT智慧货箱解决方案

物流仓储公司对货箱的管理是精细化管控的一个重要环节,力求达到货物无缝追踪的精确度、库存管理的极致优化以及作业流程的全面智能化自动,从而大幅度提升物流运营的效率和准确性。然而,传统的货箱管理模式在应对这些新兴挑战时,逐渐暴露出多重瓶颈与痛点:效率低下与数据不…

C++ STL stack容器——栈

stack容器 基本概念 stack是一种先进后出的数据结构,它只有一个出口,形式如下图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何地方可以存取stack的娶她元素。换句话说,stack不允许有遍历行为。 元素推入栈的操作称为push,将元素推出栈…

Ansible教程

1.安装ansible 在有安装python情况下: pip install ansible 或者指定版本: pip install ansible==2.7.2 没有安装python情况下: ubuntu: apt install ansible centos: yum install ansible -y 2.查看ansible版本及配置文件 ansible --version 3.修改ansible配置 cd /opt n…

Overloud Gem Bundle Complete 2024 是一套出色的音频插件

Overloud Gem Bundle Complete 2024 是一套出色的音频插件,专为专业音频工程师、音乐制作人和爱好者设计。它精确模拟了古老的模拟电路,提供了丰富、温暖和逼真的声音,适合高质量音频创作。该套件还加入了 Dopamine、ECHOSON、Mod、Modula、OTD-2 和 Sculptube 等增强功能,…

怎么理解cpu内核多核

References:cpu多核的来历,cpu性能与核心数的联系 如何理解处理器、CPU、多处理器、内核、多核? 内核/逻辑处理器/线程/多线程/多CPU/多核CPU CPU相关概念:物理cpu数、核数、逻辑cpu数,12核20线程实例分析 Multi-Core on Chip Architecture *doc - IKsingle-core vs multi-c…

Fast Rcnn

物体检测Faster Rcnn系列 目标检测概论 之前我们在机器学习了解过各种分类和回归算法目标检测需要检测物体的位置,那么把目标检测看成回归任务?好像不太合适,因为一张图像可能有多个目标 那么看做分类问题呢看成分类问题,用的是滑动窗口把图片划分为几个区域,然后一个个预…

W外链平台短链稳定不,有广告吗?

关于W外链平台的短链稳定性及是否有广告情况如下: 短链稳定性: 技术保障方面:W外链平台具备一定的技术优势来保障短链的稳定性。它拥有短网址生成核心技术,能通过算法压缩等方式生成短链并存储对应关系确保跳转;采用了高可用架构、缓存策略、安全防护等技术手段。所以…

springboot启动报错:警告Could not open windows registry node Software\JavaSoft\Prefs at root 0x80000002.

意思是无法在根目录0x80000002打开/创建prefs根节点Software\JavaSoft\Prefs且不会影响正常程序运行 解决:WIN+R regedit HKEY_LOCAL_MACHINE\Software\JavaSoft 新建项:Prefs 重新启动java项目,搞定

高智能化 智能传感器让数据采集和计算变得简单 实现自动检测和自动计算

高智能化 智能传感器让数据采集和计算变得简单 实现自动检测和自动计算智能传感器是一种具有自动检测、自动识别和自动计算功能的传感器。它将传感器相关数据(如传感器型号、量程、K值、B值、编号等)写入电子标签,并将电子标签嵌入到传感器内部。在读取传感器数据的同时,智能…

记录一个opencv的imread方法无法读取成功的问题,【设计到visual studio和静态库(lib)匹配的问题】

一、为什么会遇到这个问题 公司需要对多图进行拼接,经过多番查找发现了OpenStitching这个库。可以实现多图拼接。在python段尝试了之后感觉效果不错,所以使用Visual Studio进行C++开发。 在读取图片的时候发现imread方法无论怎么样都无法读取到图片。 解决办法 我一开始以为是…