C# (.NET) 中的 HTML 解析:HtmlAgilityPack 和 AngleSharp 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 中的 HTML 解析:HtmlAgilityPack 和 AngleSharp 库概述



HTML 解析是开发网页抓取器、内容分析器和自动化工具时的关键任务之一。在 C# (.NET) 生态系统中,有几个成熟的库允许从 HTML 文档中提取数据、操作 DOM 树并对元素执行查询。在本文中,我们将详细介绍两个最流行的库:HtmlAgilityPack 和 AngleSharp,包括它们的功能、语法和使用示例。



1. HtmlAgilityPack — 久经考验的工具



HtmlAgilityPack (HAP) 是 .NET 中最古老、最广泛使用的 HTML 解析库之一。它同时支持 .NET Framework 和 .NET Core / .NET 5+。主要优势在于处理“脏”HTML(无效标记、未闭合标签)时的简单性和容错性。



安装

// 通过 NuGet Package ManagerInstall-Package HtmlAgilityPack

// 或通过 .NET CLIdotnet add package HtmlAgilityPack


基本示例:提取 H1 标题

using HtmlAgilityPack;

string html = @"<html><body> <h1>标题 1</h1> <h1>标题 2</h1> <p>段落文本</p></body></html>";

var doc = new HtmlDocument();doc.LoadHtml(html);

var h1Nodes = doc.DocumentNode.SelectNodes("//h1");if (h1Nodes != null){ foreach (var node in h1Nodes) { Console.WriteLine(node.InnerText.Trim()); }}// 输出:// 标题 1// 标题 2


使用 XPath 和 CSS 选择器

HtmlAgilityPack 默认使用 XPath 进行导航。但是,通过 HtmlAgilityPack.CssSelectors 包,可以应用 CSS 选择器:

// 安装:dotnet add package HtmlAgilityPack.CssSelectorsusing HtmlAgilityPack.CssSelectors;

// ... 加载文档后var links = doc.DocumentNode.QuerySelectorAll("a.external-link");foreach (var link in links){ Console.WriteLine(link.GetAttributeValue("href", ""));}


解析真实网站

using System.Net.Http;using HtmlAgilityPack;

var url = "https://example.com/articles";var httpClient = new HttpClient();var html = await httpClient.GetStringAsync(url);

var doc = new HtmlDocument();doc.LoadHtml(html);

// 提取所有文章标题var articles = doc.DocumentNode.SelectNodes("//article/h2/a");if (articles != null){ foreach (var article in articles) { var title = article.InnerText.Trim(); var link = article.GetAttributeValue("href", ""); Console.WriteLine($"{title} -> {link}"); }}


2. AngleSharp — 现代替代方案



AngleSharp 是一个较新的库,提供对 HTML5、CSS3、JavaScript(有限支持)和 DOM 规范的全面支持。它非常适合需要精确匹配浏览器渲染的任务。支持 .NET Standard 2.0+,这意味着与 .NET Framework 4.6.1+ 和 .NET Core 兼容。



安装

dotnet add package AngleSharp


基本示例:提取所有链接

using AngleSharp;using AngleSharp.Dom;using AngleSharp.Html.Parser;

var html = @"<html><body> <a href='https://example.com'>示例</a> <a href='https://test.com'>测试</a></body></html>";

var parser = new HtmlParser();IDocument document = parser.ParseDocument(html);

var links = document.QuerySelectorAll("a");foreach (var link in links){ Console.WriteLine($"{link.TextContent} -> {link.GetAttribute("href")}");}// 输出:// 示例 -> https://example.com// 测试 -> https://test.com


处理属性

推荐