2013-08-09 13 views
8

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-Anfragen 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.HTML analysieren, um den Variablenwert des Skripts zu erhalten

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 für eine ideale Art und Weise bin auf der Suche, die Daten zwischen ‚spect‘ zu packen und sie zu analysieren. 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.

+2

das ist genau, warum Sie es verwenden, mit 2 oder 3 Zeilen Code können Sie den Skript-Inhalt mit HTMLAgilityPack extrahieren und dann einfach mit einem Regex oder sogar einem JavaScript-Evaluator analysieren, um den Wert von spect zu erhalten, der die gesamte Arbeit vereinfachen würde Parsing es mit einer Regex. – Prix

+0

Entschuldigung, aber wenn Sie nicht selbst Code in 5 Minuten schreiben können, kann es ein Hinweis darauf sein, dass das Problem komplexer ist, als Sie ursprünglich dachten - deshalb existieren bestehende Lösungen :). Es ist etwas schwierig zu sehen, was Ihr Ziel eigentlich ist - wollen Sie etwas Neues lernen, haben Sie explizite Einschränkungen, keine externen Bibliotheken zu verwenden, möchten Sie üben, bestimmte Art von Code zu schreiben? –

+0

Ich löste es, indem ich einen regulären Ausdruck schrieb, wird in einem Moment eigene Frage beantworten. Der Grund, warum ich die Verwendung einer Bibliothek vermeiden wollte, weil dies der einzige Punkt in der Anwendung ist, muss ich dieses bisschen JavaScript analysieren. Ich hielt es für eine schlechte Übung, eine Bibliothek für diese eine Aufgabe zu verwenden, wenn es theoretisch ohne eine möglich ist. Der Grund, warum ich gefragt habe, ist herauszufinden, welche anderen Möglichkeiten zur Lösung dieses Problems zur Verfügung stehen. In anderen Projekten stehe ich häufig vor diesem Problem und benutze normalerweise CsQuery oder HTMLAgilityPack, aber für diesen einen Aufruf wollte ich diese Bibliotheken vermeiden. –

Antwort

15

Sehr einfaches Beispiel, wie dies einfach sein könnte ein HTMLAgilityPack und Jurassic library mit dem Ergebnis zu bewerten:

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

Ausgang:

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

Hinweis: Ich bereue keine Fehler oder irgendetwas anderes, dies dient lediglich als ein Beispiel dafür, wie man das Skript greift und den Wert von spect auswertet.

Es gibt ein paar andere Bibliotheken zum Ausführen/Auswerten von JavaScript.

+0

Obwohl ich mich für einen regulären Ausdruck entschieden habe, mag ich diese Antworten, da ich Jurassic noch nie benutzt habe, und das wird trotz allem in zukünftigen Projekten nützlich sein. –

+0

Gibt mir Fehler auf, wo – Cannon

+0

@buffer_overflow eine neue Frage mit Ihrem Problem machen und ich bin sicher, dass jemand Ihnen damit helfen wird. – Prix

Verwandte Themen