在 C# 中,解析 HTML 通常需要依赖第三方库来简化工作。因为 C# 标准库并不直接提供专门的 HTML 解析工具,所以使用流行的库如 HtmlAgilityPack 和 AngleSharp 可以有效地解析和操作 HTML 内容。以下是几种常见的方式来解析 HTML:
1. 使用 HtmlAgilityPack
HtmlAgilityPack 是一个功能强大的 .NET 库,用于解析 HTML 文件并允许你通过 DOM 操作 HTML 内容。它可以处理不规范的 HTML,特别是在抓取网页时常见的错误。
安装 HtmlAgilityPack
首先,你需要通过 NuGet 安装 HtmlAgilityPack:
Install-Package HtmlAgilityPack
示例代码:解析 HTML 并提取数据
using HtmlAgilityPack;
using System;
public class HtmlParser
{
public static void Main()
{
// 创建一个 HtmlDocument 对象
var web = new HtmlWeb();
// 加载 HTML 文档
var doc = web.Load("https://example.com");
// 获取网页中的所有链接
foreach (var link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
Console.WriteLine(link.GetAttributeValue("href", ""));
}
}
}
在这个例子中,我们使用 HtmlWeb 类从 URL 加载 HTML,然后使用 SelectNodes 方法来查找页面中所有 <a> 标签的 href 属性。
2. 使用 AngleSharp
AngleSharp 是另一个功能强大的 HTML 解析库,专为浏览器类的 DOM 操作设计,可以解析 HTML、CSS 和 JavaScript。
安装 AngleSharp
你可以通过 NuGet 安装 AngleSharp:
Install-Package AngleSharp
示例代码:解析 HTML 并提取数据
using AngleSharp;
using AngleSharp.Dom;
using System;
using System.Threading.Tasks;
public class HtmlParser
{
public static async Task Main()
{
// 创建一个浏览器上下文
var config = Configuration.Default.WithDefaultLoader();
var document = await BrowsingContext.New(config).OpenAsync("https://example.com");
// 获取所有链接
var links = document.QuerySelectorAll("a");
foreach (var link in links)
{
Console.WriteLine(link.GetAttribute("href"));
}
}
}
AngleSharp 允许你以异步的方式加载网页,这对于需要抓取大量网页内容的应用程序特别有用。
3. 使用 .NET 内置的 HtmlDocument
如果你只需要进行简单的 HTML 解析,而不想引入额外的库,也可以使用 System.Windows.Forms 中的 HtmlDocument 类(适用于 Windows Forms 应用程序)。
示例代码:
using System;
using System.Windows.Forms;
public class HtmlParser
{
public static void Main()
{
var htmlDoc = new HtmlDocument();
// 加载 HTML 字符串
htmlDoc.LoadHtml("<html><body><a href='https://example.com'>Click here</a></body></html>");
// 获取链接
var link = htmlDoc.DocumentNode.SelectSingleNode("//a");
Console.WriteLine(link.GetAttributeValue("href", ""));
}
}
不过需要注意的是,HtmlDocument 类是针对 Windows Forms 应用程序设计的,适用于较简单的 HTML 解析需求。
4. 解析 HTML 字符串与正则表达式
尽管不推荐,但有时可以通过正则表达式解析简单的 HTML 内容。对于复杂的 HTML 结构,正则表达式可能不够灵活和强大。
示例代码:
using System;
using System.Text.RegularExpressions;
public class HtmlParser
{
public static void Main()
{
string htmlContent = "<html><body><a href='https://example.com'>Click here</a></body></html>";
// 使用正则表达式提取 href 属性
var match = Regex.Match(htmlContent, @"href\s*=\s*['""](?<url>.*?)['""]");
if (match.Success)
{
Console.WriteLine(match.Groups["url"].Value);
}
}
}
虽然正则表达式可以用于简单的 HTML 提取,但它在处理复杂或不规范的 HTML 时容易失败。
总结:
- HtmlAgilityPack:适用于解析不规范或复杂的 HTML,常用于网页抓取。
- AngleSharp:更现代化,支持更完整的浏览器风格解析,尤其适用于需要异步加载的场景。
- .NET 内置
HtmlDocument:适合简单需求,适用于 Windows Forms 应用程序。 - 正则表达式:用于非常简单的 HTML 解析,通常不推荐用于复杂场景。
推荐使用 HtmlAgilityPack 或 AngleSharp,它们提供了强大而灵活的功能,适用于大多数 HTML 解析需求。