Analyser HTML pour obtenir la valeur de la variable de script

c# html-agility-pack javascript

Question

J'essaie de trouver une méthode d'accès aux données entre les balises renvoyées par un serveur auquel je fais des requêtes HTTP. Le document comporte plusieurs balises, mais une seule contient un code JavaScript, le reste étant inclus dans des fichiers. Je veux accéder au code entre la balise de script.

Un exemple de code est:

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

Je cherche un moyen idéal pour saisir les données entre 'spect' et les analyser. Parfois, il y a un espace entre 'spect' et le '=' et parfois, il n'y en a pas. Aucune idée pourquoi, mais je n'ai aucun contrôle sur le serveur.

Je sais que cette question a peut-être été posée, mais les réponses suggèrent d'utiliser quelque chose comme HTMLAgilityPack, et je préfère éviter d'utiliser une bibliothèque pour cette tâche car je n'ai besoin d'obtenir le code JavaScript qu'une seule fois.

Réponse acceptée

Voici un exemple très simple illustrant comment cela pourrait être facile en utilisant une bibliothèque HTMLAgilityPack et Jurassic pour évaluer le résultat:

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

Sortie:

[["tempérer", "init", []], ["fw / lib", "init", [{"staticRoot": "// site.com/js/"**********,", "dm", [{"tackmod": "profile", "xMod": "timed"}]]]

Remarque: je ne tiens pas compte des erreurs ni de quoi que ce soit d'autre, cela sert simplement d'exemple pour savoir comment saisir le script et évaluer la valeur de spect.

Il existe également quelques autres bibliothèques pour l'exécution / l'évaluation de JavaScript.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi