最靠谱的方式是使用 HtmlAgilityPack 解析 HTML 获取 ,它自动处理编码、忽略大小写、跳过注释和无效嵌套;需调用 LoadHtml() 或 Load() 加载内容,用 SelectSingleNode("//title") 获取节点,再取 InnerText;注意空节点、动态渲染及编码不一致问题。
用
解析 HTML 获取
最靠谱
直接读取网页源码再用正则提取
看似简单,但实际会掉进编码识别、标签嵌套、空格换行、大小写混用(比如
)这些坑里。真正稳定的方式是用成熟的 HTML 解析器,
是 C# 生态里最常用也最轻量的选择。
安装 NuGet 包:
关键点:它自动处理编码(如 UTF-8 / GB2312)、忽略大小写、跳过注释和无效嵌套,比手写字符串操作可靠得多。
必须先调用
或
,不能直接对原始响应流调用
如果网页用了
但响应头声明为
,
默认按响应头解码——这时要手动指定编码:
和
都能匹配,XPath 不区分大小写;但
(没加
)只查子节点,容易漏掉
用
+
抓取远程网页标题
不能只靠
或
拿到 HTML 字符串就完事——它们不自动处理重定向后的最终 URL、不默认带 User-Agent(可能被 403)、也不处理 gzip 响应体。现代做法是统一用
。
立即学习
“
前端免费学习笔记(深入)
”;
C知道
CSDN推出的一款AI技术问答工具
下载
示例片段:
内部已自动解压 gzip/deflate,不用额外处理
如果目标站强制 HTTPS 重定向,
默认跟随,但要注意
默认是 50,够用
比
更安全——避免把
解成带实体的乱码
本地 HTML 文件或已有字符串怎么快速取 title
不需要发 HTTP 请求时,别绕路走网络栈。直接加载字符串或文件路径即可,但注意编码陷阱。
从文件读取:
—— 显式传编码比让库猜更稳
从字符串加载:
,此时编码由字符串本身决定(.NET 中
是 UTF-16,但内容可能是 UTF-8 编码的字节转过来的,得确认源头)
如果 HTML 里有
,
会把 script 内容当纯文本返回,结果是 "Dashboard";而
会返回整个内容含 script 标签——多数情况你要的是前者
遇到
在
怎么办
这是最常卡住人的地方:不是代码写错了,而是
根本不存在,或者被 JS 动态插入(服务端 HTML 里没有)。
先检查
是否为 0,而不是直接调
后取
有些网页把 title 放在
外面(不符合规范但真实存在),试试
(全文档搜索)而非
如果页面是单页应用(SPA),初始 HTML 可能只有
,真实标题由 JS 设置——这种场景 C# 后端解析不到,得换方案(比如 PuppeteerSharp 渲染后抓取)
标题解析看着简单,真正上线后出问题的几乎都卡在编码、空节点、动态渲染这三块。别省那几行空值判断,也别信“HTML 肯定有 title”这种假设。
HtmlAgilityPackHtmlAgilityPackInstall-Package HtmlAgilityPackdoc.LoadHtml(htmlString)doc.Load(url)SelectSingleNodeutf-8HtmlAgilityPackdoc.OptionDefaultStreamEncoding = Encoding.GetEncoding("GB2312")//title//TITLEdoc.DocumentNode.SelectSingleNode("title")//HttpClientHtmlAgilityPackWebClientHttpWebRequestHttpClientvar client = new HttpClient();
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0");
var html = await client.GetStringAsync("https://example.com");
var doc = new HtmlDocument();
doc.LoadHtml(html);
var titleNode = doc.DocumentNode.SelectSingleNode("//title");
string title = titleNode?.InnerText.Trim() ?? string.Empty;GetStringAsyncHttpClientMaxAutomaticRedirectionsInnerTextInnerHtmlHello & World doc.Load("page.html", Encoding.UTF8)doc.LoadHtml(htmlString)stringDashboard InnerTextInnerHtmlNullReferenceExceptionSelectSingleNodedoc.DocumentNode.SelectNodes("//head/title").CountSelectSingleNode.InnerText//title//head/titleLoading... 