使用HtmlAgilityPack获取JavaScript函数内的Innerhtml值
操作方法
核心思路
先通过HtmlAgilityPack定位到包含目标JS的script节点拿到文本内容,再通过正则匹配提取硬编码在JS里的三个目标值。
实现步骤
- 第一步:加载HTML文档,用XPath筛选出包含
set_rate函数的<script>节点,取出节点内的JS文本。 - 第二步:编写对应正则表达式,匹配三个赋值语句中双引号包裹的内容。
可直接运行的代码示例
首先确保你已经安装了HtmlAgilityPack库,之后参考以下C#代码实现:
using HtmlAgilityPack; using System; using System.Text.RegularExpressions; public class JsValueExtractor { public static void ExtractValues(string htmlContent) { // 加载HTML文档 HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(htmlContent); // 定位目标script节点 HtmlNode targetScript = htmlDoc.DocumentNode.SelectSingleNode("//script[contains(text(), 'function set_rate')]"); if (targetScript == null) { Console.WriteLine("未找到目标script节点"); return; } string jsText = targetScript.InnerText; // 正则提取三个值 Match rateCMatch = Regex.Match(jsText, @"\$\('#rate_c'\)\.html\(""([^""]+)""\)"); Match rateGMatch = Regex.Match(jsText, @"\$\('#rate_g'\)\.html\(""([^""]+)""\)"); Match timeMatch = Regex.Match(jsText, @"\$\('#time'\)\.html\(""([^""]+)""\)"); // 输出结果,实际使用可按需要转换类型(比如把汇率转成decimal) if (rateCMatch.Success) Console.WriteLine($"rate_c值:{rateCMatch.Groups[1].Value}"); if (rateGMatch.Success) Console.WriteLine($"rate_g值:{rateGMatch.Groups[1].Value}"); if (timeMatch.Success) Console.WriteLine($"时间值:{timeMatch.Groups[1].Value}"); } }
注意事项
- 如果你页面中存在多个script标签,可以给XPath增加更严格的筛选条件,比如
//script[@type='text/javascript' and contains(text(), 'set_rate')],避免匹配到无关节点。 - 正则里的
[^""]+规则只会匹配双引号之间的内容,只要JS代码结构不变,提取结果不会出现偏差。
内容的提问来源于stack exchange,提问作者abhay9
相关产品推荐
相关产品推荐

