跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

C#怎么获取当前网页的Title标题_C#如何解析HTML头信息【代码】

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

相关文章