C# 解析HTML以获取脚本变量值

C# 解析HTML以获取脚本变量值,c#,javascript,html-agility-pack,C#,Javascript,Html Agility Pack,我试图找到一种方法来访问我向其发出HTTP请求的服务器返回的标记之间的数据。文档有多个标记,但其中只有一个标记之间有JavaScript代码,其余的都包含在文件中。我想访问脚本标记之间的代码 代码的一个示例是: <html> // Some HTML <script> var spect = [['temper', 'init', []], ['fw\/lib', 'init', [{staticR

我试图找到一种方法来访问我向其发出HTTP请求的服务器返回的标记之间的数据。文档有多个标记,但其中只有一个标记之间有JavaScript代码,其余的都包含在文件中。我想访问脚本标记之间的代码

代码的一个示例是:

<html>
    // Some HTML

    <script>
        var spect = [['temper', 'init', []],
                    ['fw\/lib', 'init', [{staticRoot: '//site.com/js/'}]],
                    ["cap","dm",[{"tackmod":"profile","xMod":"timed"}]]];

    </script>

    // More HTML
</html>

//一些HTML
变量spect=[['temple','init',[]],
['fw\/lib','init',[{staticRoot:'//site.com/js/'}]],
[“cap”、“dm”、“[{“tackmod”:“profile”、“xMod”:“timed”}]];
//更多HTML
我正在寻找一种理想的方法来获取“spect”之间的数据并对其进行解析。有时“spect”和“=”之间有空格,有时则没有。不知道为什么,但我无法控制服务器


我知道可能有人问过这个问题,但回答建议使用类似HTMLAgilityPack的东西,我宁愿避免使用库来完成这项任务,因为我只需要从DOM中获取一次JavaScript。

非常简单的示例,说明了如何使用和评估结果:

var html = @"<html>
             // Some HTML
             <script>
               var spect = [['temper', 'init', []],
               ['fw\/lib', 'init', [{staticRoot: '//site.com/js/'}]],
               [""cap"",""dm"",[{""tackmod"":""profile"",""xMod"":""timed""}]]];
             </script>
             // More HTML
             </html>";

// Grab the content of the first script element
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var script = doc.DocumentNode.Descendants()
                             .Where(n => n.Name == "script")
                             .First().InnerText;

// Return the data of spect and stringify it into a proper JSON object
var engine = new Jurassic.ScriptEngine();
var result = engine.Evaluate("(function() { " + script + " return spect; })()");
var json = JSONObject.Stringify(engine, result);

Console.WriteLine(json);
Console.ReadKey();
var html=@”
//一些HTML
变量spect=[['temple','init',[]],
['fw\/lib','init',[{staticRoot:'//site.com/js/'}]],
[“cap”、“dm”、“tackmod”:“profile”、“xMod”:“timed”}]];
//更多HTML
";
//获取第一个脚本元素的内容
HtmlAgilityPack.HtmlDocument doc=新的HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var script=doc.DocumentNode.subjects()
.Where(n=>n.Name==“脚本”)
.First().InnerText;
//返回spect的数据并将其字符串化为适当的JSON对象
var engine=new Jurassic.ScriptEngine();
var result=engine.Evaluate((function(){+script+“return spect;}”)();
var json=JSONObject.Stringify(引擎、结果);
Console.WriteLine(json);
Console.ReadKey();
输出:

[[“回火”,“初始化”,“初始化”,“初始化”,“初始化”,“静态根”:”//site.com/js/“}]],[“cap”,“dm”,[{“tackmod”:“profile”,“xMod”:“timed”}]]

注意:我没有说明错误或其他原因,这只是一个示例,说明如何获取脚本并评估spect的价值


还有一些其他库用于执行/评估JavaScript。

这正是您使用它的原因,使用2或3行代码,您可以使用HTMLAgilityPack提取脚本内容,然后使用正则表达式甚至JavaScript计算器对其进行解析,以获得spect的值,这将简化使用正则表达式对其进行解析的整个工作。抱歉,但如果您不能在5分钟内自己编写代码,这可能表明问题比您最初认为的更复杂——这就是现有解决方案存在的原因:)。很难看出你的目标到底是什么——你想学习新东西吗,你有没有明确的限制不使用外部库,你想练习编写特定类型的代码?我通过编写正则表达式解决了这个问题,稍后将回答自己的问题。我之所以不想使用库,是因为这是应用程序中唯一需要解析这段JavaScript的地方。我认为使用一个库来完成这一任务是一种不好的做法,而理论上没有它是可能的。我问这个问题的原因是为了了解解决这个问题还有哪些其他选择。我在其他项目中多次遇到这个问题,通常都会使用CsQuery或HTMLAgilityPack,但在这次调用中,我想避免使用它们库。尽管我选择使用正则表达式,事实上,我喜欢这个答案,因为我从未使用过侏罗纪,它在未来的项目中将会派上用场。@buffer\u溢出对你的问题提出一个新问题,我相信有人会帮你解决。我在这里提出了一个问题,但似乎没有回答@缓冲区溢出从你发布到现在还不到一天,等一下,有人会帮你的!请记住,这不是一个付费服务网站,在这里你可以发布并获得即时答案,解决你的所有问题。如果脚本需要阅读DOM怎么办?我们可以将HTML传递到Jurassic吗?