c#教你网站数据轻松解析抓取,HtmlAgilityPack解析的奇妙之处

简介: c#教你网站数据轻松解析抓取,HtmlAgilityPack解析的奇妙之处

HtmlAgilityPack是使用C#编写的开源HTML解析库,可以轻松解析和操作HTML文档。在C#中使用HtmlAgilityPack执行各种任务,如提取数据、修改文档结构等。在本文中,我们将详细了解HtmlAgilityPack的应用。


1.安装HtmlAgilityPack


在使用HtmlAgilityPack之前,需要下载并安装它。您可以通过Nuget管理器在Visual Studio中安装它,也可以从Github在线存储库下载并手动添加到项目中。


2.加载HTML文件


使用HtmlDocument类的Load方法加载HTML文件:

var htmlDoc = new HtmlDocument();
htmlDoc.Load("test.html");


还可以使用LoadHtml方法加载HTML字符串:

var htmlDoc = new HtmlDocument();
var htmlString = "<html><head><title>Test</title></head><body></body></html>"; 
htmlDoc.LoadHtml(htmlString);

3.获取元素

要获取HTML文档中的元素,可以使用SelectNodes和SelectSingleNode方法。SelectNodes返回一个HtmlNodeCollection对象,其中包含与选择器匹配的所有节点。SelectSingleNode返回一个HtmlNode对象,表示匹配选择器的第一个节点。


例如,要获取所有P元素,可以使用以下代码:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p");

要获取第一个H1元素,可以使用以下代码:

var h1Node = htmlDoc.DocumentNode.SelectSingleNode("//h1");

4.遍历元素节点

要遍历HTML文档中的所有元素节点,可以使用HtmlNodeCollection对象。您可以使用foreach循环,也可以使用LINQ查询中的方法,例如Where和Select。


例如,要遍历所有DIV元素,并输出其innerText属性,可以使用以下代码:

var divNodes = htmlDoc.DocumentNode.SelectNodes("//div");
foreach (var divNode in divNodes)
{
    Console.WriteLine(divNode.InnerText);
}

还可以使用LINQ,例如:

var divNodes = htmlDoc.DocumentNode.Descendants("div");
var divTexts = divNodes.Select(d => d.InnerText);
foreach (var divText in divTexts)
{
    Console.WriteLine(divText);
}

5.获取元素的属性

要获取元素的属性,可以使用GetAttributeValue方法。GetAttributeValue方法接受两个参数:属性名称和默认值。如果找不到指定的属性,则方法将返回指定的默认值。

例如,要获取具有id为test的元素的href属性,可以使用以下代码:

var testNode = htmlDoc.DocumentNode.SelectSingleNode("//a[@id='test']");
var href = testNode.GetAttributeValue("href", "");

6.修改HTML文档

使用HtmlNode类的一些属性和方法可以修改HTML文档。例如,InnerHtml和OuterHtml属性可用于设置元素的内部内容和外部HTML标记。


例如,要将H1元素的innerText属性更改为“New Title”,可以使用以下代码:

var h1Node = htmlDoc.DocumentNode.SelectSingleNode("//h1");
h1Node.InnerHtml = "New Title";

7.添加新元素

可以使用CreateElement方法创建新元素,使用AppendChild或InsertBefore方法将其添加到文档中。

例如,要创建一个新的DIV元素并在BODY元素的末尾添加它,可以使用以下代码:

var divNode = htmlDoc.CreateElement("div");
divNode.InnerHtml = "New div content";
var bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
bodyNode.AppendChild(divNode);

8.删除元素

使用Remove方法可以删除元素。

例如,要删除具有id为test的元素,可以使用以下代码:

var testNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']");
testNode.Remove();

9.过滤元素

可以使用Where和FirstOrDefault方法过滤HtmlNodeCollection对象,以获得与条件匹配的元素节点。

例如,要获取具有类名为“content”的DIV元素,可以使用以下代码:

var contentDiv = htmlDoc.DocumentNode.Descendants("div")
    .Where(d => d.Attributes["class"] != null && d.Attributes["class"].Value.Contains("content"))
    .FirstOrDefault();

10.解析HTML标记

使用HtmlAgilityPack,您可以解析和分析HTML标记,以获取它们的名称,属性和值。以下是一个示例,演示如何解析HTML标记并输出其名称,属性和值。

var html = "<div class='test' id='1'>Hello world!</div>";
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var divNode = htmlDoc.DocumentNode.SelectSingleNode("//div");
var tag = divNode.Name; // tag = div
var classAttr = divNode.Attributes["class"].Value; // classAttr = test
var idAttr = divNode.Attributes["id"].Value; // idAttr = 1
var innerText = divNode.InnerText; // innerText = Hello world!

11.XPath表达式

XPath表达式是一种查找XML或HTML文档中元素的语言。HtmlAgilityPack支持XPath表达式,可以轻松选择需要的元素。以下是一些XPath表达式示例:

  • 选择所有P元素://p
  • 选择具有CLASS属性的所有DIV元素://div[@class]
  • 选择具有ID为test的A元素://a[@id='test']
  • 获取HTML代码的片段

使用HtmlNode.InnerHtml属性,可以获取包含HTML节点及其内部代码的字符串。

例如,要获取具有ID为test的DIV元素及其内部HTML代码的字符串,可以使用以下代码:

var testDiv = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']").InnerHtml;

12.获取HTML节点的完整HTML代码

使用HtmlNode.OuterHtml属性,可以获取HTML节点及其完整的HTML代码,包括标记和属性。

例如,要获取ID为test的DIV元素的完整HTML代码,可以使用以下代码:

var testDivHtml = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='test']").OuterHtml;

总结

在C#中,HtmlAgilityPack是使用最广泛的HTML解析库之一。使用它,可以轻松地加载HTML文档,提取数据,修改文档结构等。通过XPath表达式,您可以更快速地选择所需的元素。HtmlAgilityPack非常易于安装和使用,因此是许多开发人员的首选工具。


相关文章
|
4天前
|
存储 JSON 数据处理
从JSON数据到Pandas DataFrame:如何解析出所需字段
从JSON数据到Pandas DataFrame:如何解析出所需字段
16 1
|
4天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
23 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
4天前
|
XML 移动开发 前端开发
C#HtmlAgilityPack类库再回顾
C#HtmlAgilityPack类库再回顾
12 0
|
4天前
|
存储 开发框架 .NET
C#中将DataTable转化成ListT的方法解析
C#中将DataTable转化成ListT的方法解析
9 0
|
4天前
|
数据采集 前端开发 数据挖掘
Fizzler库+C#:从微博抓取热点的最简单方法
本文介绍如何使用Fizzler库和C#构建微博热点信息爬虫。通过Fizzler的CSS选择器定位关键信息,提取热点标题和排名,实现微博内容的智能挖掘。示例代码展示单线程和多线程采集方法,并涉及代理IP使用。
Fizzler库+C#:从微博抓取热点的最简单方法
|
4天前
|
JSON 安全 前端开发
解析FormData格式数据:Python实践指南
解析FormData格式数据:Python实践指南
17 1
|
4天前
|
SQL 存储 开发框架
C# DataSet结合FlyTreeView显示树状模型数据
C# DataSet结合FlyTreeView显示树状模型数据
|
4天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
4天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。

推荐镜像

更多