Analizando HTML para obtener el valor de la variable de script

c# html-agility-pack javascript

Pregunta

Estoy tratando de encontrar un método para acceder a los datos entre las etiquetas devueltas por un servidor al que estoy haciendo solicitudes HTTP. El documento tiene varias etiquetas, pero solo una de ellas tiene un código JavaScript entre ellas, el resto se incluye desde los archivos. Quiero acceder al código entre la etiqueta de script.

Un ejemplo del código es:

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

Estoy buscando una forma ideal de capturar los datos entre 'spect' y analizarlos. A veces hay un espacio entre 'spect' y '=' y otras no. No tengo idea de por qué, pero no tengo control sobre el servidor.

Sé que esta pregunta puede haber sido formulada, pero las respuestas sugieren usar algo como HTMLAgilityPack, y prefiero evitar usar una biblioteca para esta tarea, ya que solo necesito obtener el JavaScript del DOM una vez.

Respuesta aceptada

Ejemplo muy simple de cómo esto podría ser fácil usando una biblioteca HTMLAgilityPack y Jurassic para evaluar el resultado:

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

Salida:

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

Nota: No tengo en cuenta los errores ni nada más, esto simplemente sirve como un ejemplo de cómo tomar el script y evaluar el valor de spect.

También hay algunas otras bibliotecas para ejecutar / evaluar JavaScript.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué