Ich versuche eine Methode für den Zugriff auf Daten zwischen Tags zu finden, die von einem Server zurückgegeben werden, an den ich HTTP-Anforderungen stelle. Das Dokument hat mehrere Tags, aber nur eines der Tags hat JavaScript-Code dazwischen, der Rest ist in Dateien enthalten. Ich möchte auf den Code zwischen dem Skript-Tag zugreifen.
Ein Beispiel für den Code ist:
<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>
Ich suche nach einem idealen Weg, um die Daten zwischen "spect" und parse es zu greifen. Manchmal gibt es einen Zwischenraum zwischen 'spect' und '=' und manchmal nicht. Keine Ahnung warum, aber ich habe keine Kontrolle über den Server.
Ich weiß, dass diese Frage vielleicht gestellt wurde, aber die Antworten schlagen vor, etwas wie HTMLAgilityPack zu verwenden, und ich würde eher vermeiden, eine Bibliothek für diese Aufgabe zu verwenden, da ich nur das JavaScript vom DOM einmal erhalten muss.
Ein sehr einfaches Beispiel dafür, wie einfach es sein könnte, ein HTMLAgilityPack und eine Jurassic-Bibliothek zur Auswertung des Ergebnisses zu verwenden:
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();
Ausgabe:
[["temper", "init", []], ["fw / lib", "init", [{"staticRoot": "// site.com/js/"}]],["cap", "dm", [{"tackmod": "Profil", "xMod": "zeitgesteuert"}]]]
Hinweis: Ich berücksichtige keine Fehler oder irgendetwas anderes, dies dient lediglich als ein Beispiel dafür, wie man das Skript ergreift und nach dem Wert von spect auswertet.
Es gibt ein paar andere Bibliotheken, um JavaScript ebenfalls auszuführen / zu bewerten.