在 .NET 开发和 Web 抓取的世界中,处理 HTML 和 CSS 是一个常见且重要的任务。传统的字符串操作或正则表达式往往繁琐且容易出错。幸运的是,AngleSharp 的出现为我们提供了一个优雅、高效且符合 W3C 标准的解决方案。
什么是 AngleSharp?
AngleSharp 是一个开源的 .NET 库,它能够解析 HTML5、CSS3、XML 和 SVG 文档,并构建一个符合 DOM(文档对象模型)标准的结构。这意味着你可以像在浏览器中使用 JavaScript 一样,通过 AngleSharp 在 .NET 中轻松地查询和操作网页元素及其样式。
AngleSharp GitHub地址:https://github.com/AngleSharp/AngleSharp
为什么选择 AngleSharp?
- 优雅的 API: AngleSharp 提供了直观且易于使用的 API,使得代码更具可读性和可维护性。
- 符合 W3C 标准: 它严格遵循 HTML5 和 CSS3 规范,确保解析的准确性和可靠性。
- 强大的选择器支持: 你可以使用熟悉的 CSS 选择器轻松地定位和选取网页元素。
- 完整的 DOM 实现: AngleSharp 构建了完整的 DOM 树,方便你进行各种文档操作。
- 性能高效: 相比于自己编写解析器或使用正则表达式,AngleSharp 在性能方面表现出色。
- .NET 友好: 作为一个纯 .NET 库,它可以无缝集成到你的 .NET 项目中。
AngleSharp 的基本用法
要开始使用 AngleSharp,你需要通过 NuGet 包管理器将其添加到你的 .NET 项目中:
Install-Package AngleSharp
接下来,让我们看一些基本的使用示例:
1. 解析 HTML 字符串
using AngleSharp.Html.Parser;
using System;
public class Example
{
public static void Main(string[] args)
{
var html = @"
<!DOCTYPE html>
<html>
<head><title>我的示例页面</title></head>
<body>
<h1>欢迎来到 AngleSharp!</h1>
<p class='intro'>这是一个段落。</p>
<ul>
<li id='item1'>列表项 1</li>
<li>列表项 2</li>
</ul>
</body>
</html>";
// 创建 HTML 解析器
var parser = new HtmlParser();
// 解析 HTML
var document = parser.ParseDocument(html);
// 获取文档标题
var title = document.Title;
Console.WriteLine($"页面标题: {title}"); // 输出: 页面标题: 我的示例页面
// 使用 CSS 选择器获取第一个 h1 元素
var heading = document.QuerySelector("h1");
Console.WriteLine($"第一个 H1: {heading?.TextContent}"); // 输出: 第一个 H1: 欢迎来到 AngleSharp!
// 使用 CSS 选择器获取所有 class 为 'intro' 的元素
var introParagraphs = document.QuerySelectorAll(".intro");
foreach (var p in introParagraphs)
{
Console.WriteLine($"Intro 段落内容: {p.TextContent}"); // 输出: Intro 段落内容: 这是一个段落。
}
// 使用 CSS 选择器获取 id 为 'item1' 的列表项
var listItem1 = document.QuerySelector("#item1");
Console.WriteLine($"列表项 1 的内容: {listItem1?.TextContent}"); // 输出: 列表项 1 的内容: 列表项 1
}
}
2. 从 URL 加载 HTML
using AngleSharp.Html.Parser;
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class Example
{
public static async Task Main(string[] args)
{
var url = "https://www.example.com";
using var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync(url);
var parser = new HtmlParser();
var document = parser.ParseDocument(response);
var title = document.QuerySelector("title")?.TextContent;
Console.WriteLine($"页面标题: {title}");
}
}
3. 操作 DOM 元素
using AngleSharp.Dom;
using AngleSharp.Html.Parser;
using System;
public class Example
{
public static void Main(string[] args)
{
var html = "<div id='container'><p class='item'>Item 1</p></div>";
var parser = new HtmlParser();
var document = parser.ParseDocument(html);
var container = document.QuerySelector("#container");
// 创建新的元素
var newParagraph = document.CreateElement("p");
newParagraph.ClassName = "item";
newParagraph.TextContent = "Item 2";
// 将新元素添加到容器中
container?.AppendChild(newParagraph);
// 获取所有 class 为 'item' 的段落
var items = document.QuerySelectorAll(".item");
foreach (var item in items)
{
Console.WriteLine(item.TextContent);
}
// 输出:
// Item 1
// Item 2
}
}
4. 使用 CSS 选择器获取属性值
using AngleSharp.Html.Parser;
using System;
using System.Linq;
public class Example
{
public static void Main(string[] args)
{
var html = "<a href='https://www.example.com' data-id='123'>Example Link</a>";
var parser = new HtmlParser();
var document = parser.ParseDocument(html);
var link = document.QuerySelector("a");
var href = link?.GetAttribute("href");
var dataId = link?.GetAttribute("data-id");
Console.WriteLine($"链接地址: {href}"); // 输出: 链接地址: https://www.example.com
Console.WriteLine($"Data ID: {dataId}"); // 输出: Data ID: 123
}
}
Web 抓取实战示例 (简单场景)
假设我们需要从一个简单的网页中抓取所有的链接和它们的文本:
using AngleSharp.Html.Parser;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Linq;
using AngleSharp.Dom;
public class WebScraper
{
public static async Task Main(string[] args)
{
var url = "https://www.example.com"; // 替换为你要抓取的网址
using var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync(url);
var parser = new HtmlParser();
var document = parser.ParseDocument(response);
var links = document.QuerySelectorAll("a");
if (links.Any())
{
Console.WriteLine("抓取到的链接:");
foreach (var link in links)
{
var href = link.GetAttribute("href");
var text = link.TextContent.Trim();
Console.WriteLine($"- Text: {text}, URL: {href}");
}
}
else
{
Console.WriteLine("未找到任何链接。");
}
}
}
AngleSharp 作为一个强大且易于使用的 .NET 库,极大地简化了在 .NET 应用程序中解析和操作 HTML 与 CSS 的过程。无论是进行简单的网页分析,还是构建复杂的 Web 抓取工具,AngleSharp 都提供了优雅且高效的解决方案。掌握 AngleSharp 的使用,将显著提升 .NET 开发人员和 Web 抓取爱好者的工作效率。