HtmlAgilityPack 是解析 HTML 中 img 标签 src 属性最稳定轻量的选择;应使用 LoadHtml() 加载、XPath //img[@src] 查找,优先提取 data-src 等懒加载属性,并手动处理相对路径与无效值。
用 HtmlAgilityPack 读取
标签的
属性最稳
直接上手别绕弯:
c#
解析 html 图片地址,
是当前最可靠、最轻量、兼容性最好的选择。正则匹配
看似快,但一遇到换行、属性顺序混乱、cdata 或自闭合写法(
)就漏数据,不推荐。
实操建议:
用 NuGet 安装
(注意选官方作者
,不是带“.netcore”后缀的旧分支)
加载 HTML 时优先用
而非
,避免因路径或编码问题抛
用
XPath 查找,比遍历所有节点再判断
属性更准——有些
标签可能根本没
(比如只含
)
处理相对路径要手动补全 base URL
值是
或
很常见,但
不自动解析相对路径。如果你需要绝对 URL,必须自己补全。
关键点:
如果原始 HTML 来自网页,用页面本身的 URL 作 base(比如
),再调用
遇到协议相对路径(
),需先检查当前请求协议;若上下文无 scheme(如本地文件),得手动拼
空字符串、
、
这类值要过滤掉,它们不是有效图片地址
警惕 lazyload 场景:
和
才是真地址
现代网页大量用懒加载,
可能是占位图(
)或空,真实地址藏在
、
、甚至
里。
立即学习
“
前端免费学习笔记(深入)
”;
C知道
CSDN推出的一款AI技术问答工具
下载
别硬编码只取
:
对每个
节点,按优先级查:先
,再
,最后 fallback 到
用
安全取值,避免
有些站点用 JS 动态生成地址(比如拼接 timestamp),这种靠服务端 HTML 解析拿不到,得换 PuppeteerSharp 或 Playwright
用 LINQ 查询比循环更简洁,但注意空节点和命名空间
写法上,用
比 foreach 更紧凑,但容易踩两个坑:
返回可能是
(XPath 无匹配),所以要用
链式调用,别直接 .Select
如果 HTML 带 XML 命名空间(比如 XHTML 文档头含
),默认 XPath 不生效,得注册命名空间前缀或改用
提取结果里可能混入 SVG 的
,需要额外加条件判断节点名和属性名
复杂点往往不在语法,而在 HTML 本身千奇百怪的写法——多看几份真实源码,比背 API 文档管用。
imgsrchtmlagilitypackHtmlAgilityPackhtml-agility-packLoadHtml()Load()IOException//img[@src]srcimgsrcdata-srcsrc"images/logo.png""//cdn.example.com/a.jpg"HtmlAgilityPackhttps://example.com/blog/post.htmlnew Uri(baseUri, relativeSrc)//cdn..."https:" + src"#""javascript:void(0)"data-srcdata-lazy-srcsrcdata:image/gif;base64,...data-srcdata-lazy-srcdata-originalsrcimgdata-srcdata-lazy-srcsrcnode.GetAttributeValue("data-src", "")NullReferenceExceptiondoc.DocumentNode.SelectNodes("//img")?.Select(n => n.GetAttributeValue("src", ""))null?.Select(...)xmlns="http://www.w3.org/1999/xhtml"Descendants("img")