首页 > 其他分享 >解析和操作HTML文档,并进行同级或跨级匹配元素

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

时间:2024-09-05 17:27:14浏览次数:9  
标签:匹配 doc 元素 HtmlAgilityPack HTML 文档 跨级

 

 

一、插件描述
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 中,双斜杠的使用意味着跨越任意数量的层级来查找特定的元素。

标签:匹配,doc,元素,HtmlAgilityPack,HTML,文档,跨级
From: https://www.cnblogs.com/raincedar/p/18398900

相关文章