2013-08-09 12 views
8

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.Analisi dell'HTML per ottenere il valore della variabile di 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 catturare i dati tra 'SPECT' e analizzarlo. 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 fatta, ma le risposte suggeriscono di utilizzare qualcosa come HTMLAgilityPack, e preferisco evitare di utilizzare una libreria per questa attività in quanto ho solo bisogno di ottenere il codice JavaScript dal DOM una volta.

+2

è esattamente il motivo per cui lo si utilizza, con 2 o 3 righe di codice è possibile estrarre il contenuto dello script con HTMLAgilityPack e quindi analizzarlo con una regex o anche con un programma di valutazione JavaScript per ottenere il valore dello spett che semplificerebbe l'intero lavoro di analizzarlo con una regex. – Prix

+0

Siamo spiacenti, ma se non riesci a scrivere il codice da solo in 5 minuti, potrebbe essere un'indicazione che il problema è più complesso di quanto pensassi inizialmente - ecco perché esistono soluzioni esistenti :). È piuttosto difficile vedere quale sia il tuo obiettivo in realtà: vuoi imparare qualcosa di nuovo, hai delle restrizioni esplicite a non usare librerie esterne, vuoi esercitarti a scrivere un particolare tipo di codice? –

+0

L'ho risolto scrivendo un'espressione regolare, risponderò alla tua domanda in un attimo. La ragione per cui volevo evitare di usare una libreria perché questo è l'unico punto nell'applicazione che avrò bisogno di analizzare questo bit di JavaScript. Ho pensato che fosse una cattiva pratica usare una libreria per questo compito quando teoricamente è possibile senza uno. Il motivo per cui ho chiesto è di scoprire quali altre opzioni potrebbero essere disponibili per risolvere questo problema. Affronto questo problema numerose volte in altri progetti e di solito finisco per usare CsQuery o HTMLAgilityPack, ma per questa chiamata volevo evitare le librerie. –

risposta

15

Molto semplice esempio di come questo potrebbe essere facile utilizzando un HTMLAgilityPack e Jurassic library 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(); 

uscita:

[[ "carattere", "init", []], [ "FW/lib", "init", [{ "staticRoot": "// site.com/js/"}]],["cap","dm",[{"tackmod": "profilo", "xMod": "cronometrato"}]]]

Nota: Non sono responsabile 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.

+0

Anche se ho optato per un'espressione regolare, in realtà mi piacciono queste risposte perché non ho mai usato Jurassic e sarà sicuramente utile nei progetti futuri. –

+0

Mi dà errore su dove – Cannon

+0

@buffer_overflow fai una nuova domanda con il tuo problema e sono sicuro che qualcuno ti aiuterà con esso. – Prix

Problemi correlati