用 AngleSharp 处理 HTML 别再用正则了,直接上这个 C# 库
想在 .NET 环境里解析 HTML,很多人第一反应是写个正则表达式,或者随便找个能把标签去掉的工具。但如果你需要一个真正符合 W3C 标准的 DOM 树,能用 querySelector 这种浏览器熟悉的语法在后端精准定位元素,直接用 AngleSharp 就对了。它不是那种“差不多能用”的解析器,而是完整的 headless DOM 实现,不需要启动浏览器进程就能跑。
为什么不要用正则解析 HTML
很多人在写简单爬虫或数据提取时喜欢用正则,但 HTML 这种非正则语言一旦遇到嵌套标签或者属性里带个大于号,正则就崩了。AngleSharp 的核心逻辑是把 raw markup 丢进 tokenizer,然后构建 tree,最后生成一个标准的 DOM。
我之前在处理一些复杂的网页抓取任务时,尝试用简单的字符串截取,结果在遇到不规范的闭合标签时报错不断。换成 AngleSharp 后,它能像 Chrome 一样容忍那些垃圾代码,自动补全缺失的标签,这才是工业级解析器的价值。
怎么在项目里快速跑起来
在 .NET 6/7/8 环境下,直接通过 NuGet 安装 AngleSharp 即可。它的 API 设计几乎和前端 JS 一模一样,如果你会写 JavaScript 抓取,几乎零成本上手。
一个典型的使用流程是先初始化一个 HtmlParser,然后把 HTML 字符串加载成 IDocument。
using AngleSharp;
using AngleSharp.Dom;
// 1. 初始化解析器
var config = new AngleSharp.Configuration();
var parser = new HtmlParser().Parse("<div><p class='content'>Hello World</p></div>");
// 2. 使用类似 JS 的 CSS 选择器定位元素
// 这里的 querySelector 是实打实的 W3C 标准实现
var element = parser.QuerySelector(".content");
if (element != null)
{
Console.WriteLine(element.TextContent); // 输出: Hello World
}
实际操作中要注意的坑
在实际使用这个库的时候,有几个细节决定了你的运行效率和稳定性:
- 内存开销: 虽然它不需要浏览器,但构建完整的 DOM 树依然吃内存。如果你处理的是 GB 级别的超大 HTML 文件,不要一次性全部
Parse进内存,否则很容易 OOM(内存溢出)。 - CSS 选择器性能: 尽量使用 ID 选择器(
#id)而不是复杂的层级选择器,因为在巨大的 DOM 树中进行深度递归搜索会有明显的耗时增加。 - 编码问题: 如果抓取到的网页编码不是 UTF-8,在加载字符串前最好先通过
HttpClient获取原始字节流,再用正确的编码转换,否则传给 AngleSharp 的字符串本身就是乱码,解析出来的 DOM 也是错的。
性能与备选方案对比
如果你的需求只是简单的提取某个标签内容,且对性能要求极高(比如每秒处理万级页面),AngleSharp 可能会显得略重,因为它的目标是“标准兼容”而非“极致速度”。在这种场景下,可以对比一下 HtmlAgilityPack。
- AngleSharp: 强在标准兼容性。如果你依赖 CSS 选择器,或者需要一个真正的 DOM 结构来模拟浏览器行为,选它。
- HtmlAgilityPack: 强在速度和轻量。如果你只需要通过 XPath 快速捞几个字段,且不在乎它是否完全符合 W3C 规范,可以用这个。
querySelector 的心智负担比 XPath 低得多,代码可读性更高。 免费 AI 工具箱 · 全部完全免费

这问题问到点子上了!敢试这个的人不多,要是能搞定 SVG 路径归一化,效率起码翻 3 倍吧?
@程序员Tom 翻 3 倍?吹牛不交税吧,除非你给弄个能跑通的 Demo 出来。