C# (.NET) 中的 HTML 解析:从简单到复杂
HTML 解析是开发网页抓取器、内容分析器和自动化工具时的关键任务之一。在 C# (.NET) 生态系统中,有多个成熟的库可以高效地从 HTML 文档中提取数据,即使标记无效也能处理。在本文中,我们将介绍三种最流行的工具:HtmlAgilityPack、AngleSharp 和 CsQuery,并通过实际示例讲解它们的使用方法。
1. HtmlAgilityPack — 经典之选
HtmlAgilityPack (HAP) 是 C# 中最常用的 HTML 解析库。它支持 XPath 和 LINQ,非常适合处理层次结构。HAP 会自动修复无效的 HTML 标记,这在解析“原始”页面时尤其有用。
通过 NuGet 安装:
Install-Package HtmlAgilityPack示例:从页面中提取所有链接
using HtmlAgilityPack;
string url = "https://example.com";var web = new HtmlWeb();var doc = web.Load(url);
var links = doc.DocumentNode.SelectNodes("//a[@href]");if (links != null){ foreach (var link in links) { string href = link.GetAttributeValue("href", ""); string text = link.InnerText.Trim(); Console.WriteLine($"{text}: {href}"); }}示例:从表格中提取数据
var tableRows = doc.DocumentNode.SelectNodes("//table[@id='data-table']//tr");foreach (var row in tableRows){ var cells = row.SelectNodes("td"); if (cells != null) { var rowData = cells.Select(c => c.InnerText.Trim()).ToList(); Console.WriteLine(string.Join(" | ", rowData)); }}2. AngleSharp — 现代替代方案
AngleSharp 是一个更现代的库,完全用 C# 编写,符合 W3C 规范。它支持 CSS 选择器,对于习惯 jQuery 风格语法的人来说非常方便。AngleSharp 还可以处理 DOM、SVG 和 MathML。
通过 NuGet 安装:
Install-Package AngleSharp示例:使用 CSS 选择器进行解析
using AngleSharp;using AngleSharp.Dom;
var config = Configuration.Default.WithDefaultLoader();var context = BrowsingContext.New(config);var document = await context.OpenAsync("https://example.com");
// 获取所有 class 为 "product" 的元素var products = document.QuerySelectorAll(".product");foreach (var product in products){ var name = product.QuerySelector(".product-name")?.TextContent.Trim(); var price = product.QuerySelector(".product-price")?.TextContent.Trim(); Console.WriteLine($"{name}: {price}");}示例:从脚本中提取 JSON
var scripts = document.QuerySelectorAll("script[type='application/ld+json']");foreach (var script in scripts){ var json = script.TextContent; // 接下来可以通过 System.Text.Json 反序列化 JSON Console.WriteLine(json);}3. CsQuery — jQuery 风格语法
CsQuery 是 jQuery 在 C# 中的移植版本,提供了熟悉的 DOM 操作 API。它特别适合从 JavaScript 迁移到 C# 的开发者。但需要注意的是,该项目的更新频率低于 AngleSharp,可能不支持最新的 .NET 版本。
通过 NuGet 安装:
Install-Package CsQuery示例:从元素中提取文本
using CsQuery;
string html = "<div class='content'><p>你好,世界!</p></div>";var dom = CQ.Create(html);
var text = dom[".content