12

HTTP リクエストを行っているサーバーから返されたタグ間のデータにアクセスする方法を見つけようとしています。ドキュメントには複数のタグがありますが、JavaScript コードが間にあるタグは 1 つだけで、残りはファイルから含まれています。scriptタグ間のコードにアクセスしたい。

コードの例は次のとおりです。

<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>

「スペクト」の間でデータを取得して解析する理想的な方法を探しています。「spect」と「=」の間にスペースがある場合とない場合があります。理由はわかりませんが、サーバーを制御できません。

この質問が寄せられた可能性があることは承知していますが、HTMLAgilityPack のようなものを使用するように回答されています。DOM から JavaScript を取得する必要があるのは 1 回だけなので、このタスクにライブラリを使用することは避けたいと思います。

4

1 に答える 1

25

HTMLAgilityPackJurassic ライブラリを使用して結果を評価するのがいかに簡単かを示す非常に単純な例:

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();

出力:

[["temper","init",[]],["fw/lib","init",[{"staticRoot":"//site.com/js/"}]],["cap", "dm",[{"tackmod":"profile","xMod":"timed"}]]]

注:私はエラーなどを考慮していません。これは、スクリプトを取得して spect の値を評価する方法の例としてのみ役立ちます。

JavaScript を実行/評価するためのライブラリが他にもいくつかあります。

于 2013-08-09T23:59:09.333 に答える