HtmlAgilityPack是一个开放源代码的类库,用于从HTML文档中提取数据或操作HTML文档。它可以被用来分析HTML文档,它的底层技术和.NET Framework类似,用于将HTML文档转换为XML文档,这让开发者可以使用XML DOM API提取文档内容。HtmlAgilityPack支持HTML5和CSS3。
在C#中,HtmlAgilityPack是非常流行的一种HTML解析器,可以方便地从HTML文档中提取数据,例如从一个网站抓取文章、新闻、图片等信息。
下面介绍一下HtmlAgilityPack的基本用法和功能。
安装和引用
HtmlAgilityPack 可以在 Visual Studio 中添加 NuGet 引用,也可以从 Github 上下载源代码手动添加到项目中。添加NuGet引用的方法:
- 在 Visual Studio 中,打开 NuGet 包管理器。
- 搜索 HtmlAgilityPack
- 选择你需要的版本并安装。
加载 HTML 页面
HtmlAgilityPack 提供了一个名为 HtmlDocument
的类,它用于读取和操作 HTML 页面。可以使用以下的代码创建一个 HtmlDocument
对象:
var htmlDoc = new HtmlDocument();
要加载 HTML 页面,需要使用 Load
或者 LoadHtml
方法:
htmlDoc.Load("file.htm"); htmlDoc.LoadHtml("<html><head><title>My test page</title></head><body>Hello world!</body></html>");
选择器
选择器是 HtmlAgilityPack 的一个重要特性,它让你能够轻易地从 HTML 页面中选择元素。就像 CSS 选择器一样,HtmlAgilityPack 的选择器也用于定位特定元素或元素组。
以下是一些 HtmlAgilityPack 的选择器示例:
var htmlNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='header']"); var nodes = htmlDoc.DocumentNode.SelectNodes("//a[@href]");
第一行代码使用了 SelectSingleNode
方法选择一个具有 class
属性的 div 元素。如果你了解过XPath,那么你对上面的语法应该并不陌生。如果不了解,可以简单理解为 //
表示任何节点,[@class='header']
表示某个属性具有 header
值的元素。
第二行代码用 SelectNodes
选择在 href 属性中包含链接的所有 a 元素。此方法返回 HtmlNodeCollection
,其中包含匹配选择器表达式的所有元素。
选择器使用方法和css选择器类似。所以它们可以被分成以下几种类型:
- 元素选择器
这种选择器使用元素名称作为选择器。例如,要选择一个 div
元素,使用以下代码行:
var node = htmlDoc.DocumentNode.SelectSingleNode("//div");
- 类选择器
用于选择具有某个特定 class 属性的所有元素,如下所示:
var nodes = htmlDoc.DocumentNode.SelectNodes("//div[@class='section']");
以上代码行选择所有样式类为 section
的 div 元素。
- ID 选择器
使用ID 选择器可以选择具有特定ID属性的元素。例如,要选择元素具有 ID 属性的名称为 “my-id” 的元素,使用以下代码:
var node = htmlDoc.DocumentNode.SelectSingleNode("//div[@id='my-id']");
- 属性选择器
如果您需要选择拥有特定属性的元素,您可以使用属性选择器。以下是一个示例,选择 a
元素的 href
属性具有值的链接:
var nodes = htmlDoc.DocumentNode.SelectNodes("//a[@href]");
根据条件查找元素
元素查找器的另一个重要方面是能够查找具有特定条件的元素。以下是一些示例:
- 仅选择第一个元素:
var node = htmlDoc.DocumentNode.SelectSingleNode("//div");
- 选择第二个元素:
var node = htmlDoc.DocumentNode.SelectNodes("//div")[1];
- 选择以“test”开头的所有元素:
var nodes = htmlDoc.DocumentNode.SelectNodes("//*[starts-with(@id, 'test')]");
- 筛选出所有至少有一个子元素的
div
元素:
var nodes = htmlDoc.DocumentNode.SelectNodes("//div[child::node()]");
获取元素属性和文本
一旦您获得了所需的元素,就可以使用 OuterHtml
、InnerHtml
、InnerText
关键字访问元素的 HTML 内容和文本内容。例如:
foreach (HtmlNode link in links) { var href = link.Attributes["href"].Value; var text = link.InnerText; Console.WriteLine("Link URL: " + href); Console.WriteLine("Link Text: " + text); }
以上代码行输出链接的 URL 和文本。
修改元素
使用 HtmlAgilityPack,您可以更改元素的文本内容或属性。例如,要更改元素的文本,可以使用以下代码:
var node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='header']"); node.InnerHtml = "New header text.";
总结
HtmlAgilityPack 是一个非常有用的工具,它可以轻松地从 HTML 页面中提取数据或操作 HTML 页面,帮助我们快速开发出能够处理 HTML 页面的应用程序。掌握了本文介绍的基本用法和功能,相信您已经可以轻松地开始使用 HtmlAgilityPack了。