Analisi dell'HTML per ottenere il valore della variabile di script

c# html-agility-pack javascript

Domanda

Sto cercando di trovare un metodo per accedere ai dati tra i tag restituiti da un server a cui sto facendo richieste HTTP. Il documento ha più tag, ma solo uno dei tag ha un codice JavaScript tra di essi, il resto è incluso nei file. Voglio accedere al codice tra il tag dello script.

Un esempio del codice è:

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

Sto cercando un modo ideale per prendere i dati tra "spett" e analizzarli. A volte c'è uno spazio tra "spect" e "=" ea volte non c'è. Non ho idea del perché, ma non ho alcun controllo sul server.

So che questa domanda potrebbe essere stata posta, ma le risposte suggeriscono di utilizzare qualcosa come HTMLAgilityPack, e preferisco evitare di usare una libreria per questa attività in quanto ho bisogno solo di ottenere il codice JavaScript dal DOM una volta.

Risposta accettata

Un esempio molto semplice di come potrebbe essere semplice utilizzare una libreria HTMLAgilityPack e Jurassic per valutare il risultato:

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

Produzione:

[[ "Carattere", "init", []], [ "FW / lib", "init", [{ "staticRoot": "// site.com/js/"}]],["cap", "dm", [{ "tackmod": "profilo", "Xmod": "a tempo"}]]]

Nota: non sto tenendo conto di errori o altro, questo è solo un esempio di come afferrare la sceneggiatura e valutare il valore dello spett.

Ci sono alcune altre librerie per l'esecuzione / valutazione di JavaScript.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché