如何使用C# HtmlAgilityPack提取HTML中Script标签内的指定JSON数据
如何用HtmlAgilityPack提取script标签内的JSON内容?
嘿,我看你折腾了好久用HtmlAgilityPack提取那段HTML里的"name":"John",其实问题出在你之前的代码一直在处理div标签的文本,但目标内容藏在script标签里呢!我给你调整下代码,保证能搞定:
核心思路
- 先定位到包含目标JSON的script节点,而不是div节点
- 提取script标签内的文本内容,清理掉JS变量赋值的冗余部分,得到合法的JSON字符串
- 用JSON解析库(比如Newtonsoft.Json或内置的System.Text.Json)解析字符串,提取name字段的值
修改后的完整代码
// 替换成你需要解析的目标HTML string targetHtml = @"<html> <body class=""detailpage""> <div id=""innerLayout""> <section id=""body-container""> <div class=""wrapper""> <div class=""content"" id=""offer_active""> <div class=""clr offerbody""> <div class=""offercontent fleft rel ""> <div class=""offercontentinner""> <script> texto = {""name"":""John""}; </script> </div> </div> </div> </div> </div> </section> </div> </body> </html>"; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(targetHtml); // 用XPath精准定位到包含"texto ="的script节点,避免匹配其他无关script var targetScriptNode = doc.DocumentNode.SelectSingleNode("//script[contains(text(), 'texto =')]"); if (targetScriptNode != null) { // 提取script内的原始文本 string rawScriptText = targetScriptNode.InnerText.Trim(); // 清理掉JS变量赋值的部分,得到纯JSON字符串 string cleanJson = rawScriptText.Replace("texto = ", "") .Replace(";", "") .Trim(); // 方法1:用Newtonsoft.Json解析(需要先通过NuGet安装:Install-Package Newtonsoft.Json) dynamic jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject(cleanJson); string extractedName = jsonObject.name; Console.WriteLine($"提取到的name值:{extractedName}"); // 方法2:用.NET Core 3.0+内置的System.Text.Json(无需额外安装包) // var jsonDict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(cleanJson); // string extractedName = jsonDict["name"]; // Console.WriteLine($"提取到的name值:{extractedName}"); } else { Console.WriteLine("未找到包含目标内容的script节点"); } Console.ReadKey(true);
关键细节说明
- XPath筛选:
//script[contains(text(), 'texto =')]能帮你精准定位到目标script,避免页面上其他无关script干扰 - 文本清理:因为script里的内容是JS变量赋值语句(
texto = {"name":"John"};),必须去掉texto =和结尾的;,才能得到符合JSON规范的字符串 - JSON解析:两种解析方式任选一种,如果你用的是老版本.NET Framework,Newtonsoft.Json更兼容;如果是.NET Core/.NET 5+,用内置的System.Text.Json更轻便
内容的提问来源于stack exchange,提问作者CrazyDonkeys
相关产品推荐
相关产品推荐

