2012-07-09 10 views
10

Sto provando a racimolare una pagina Web particolare che funziona come segue.Esecuzione di script in HtmlAgilityPack

Prima carica la pagina, quindi esegue una sorta di javascript per recuperare i dati necessari per popolare la pagina. Sono interessato a quei dati.

Se ottengo la pagina con HtmlAgilityPack, lo script non viene eseguito, quindi ottengo quella che è essenzialmente una pagina per lo più vuota.

C'è un modo per forzare l'esecuzione di uno script, quindi posso ottenere i dati?

+0

dare un'occhiata a http://phantomjs.org/ –

risposta

9

Si sta ottenendo ciò che il server sta restituendo, proprio come un browser web. Un browser Web, ovviamente, esegue quindi gli script. Html Agility Pack è un parser HTML solo - non ha modo di interpretare il javascript o di collegarlo alla sua rappresentazione interna del documento. Se volessi eseguire lo script avresti bisogno di un browser web. La risposta perfetta al tuo problema sarebbe un browser web "senza testa" completo. Questo è qualcosa che incorpora un parser HTML, un interprete javascript e un modello che simula il DOM del browser, lavorando tutti insieme. Fondamentalmente, questo è un browser web, tranne senza la parte di rendering di esso. Al momento non esiste una cosa che funzioni interamente all'interno dell'ambiente .NET.

La soluzione migliore è utilizzare un controllo WebBrowser e in realtà caricare ed eseguire la pagina in Internet Explorer sotto controllo programmatico. Questo non sarà veloce o carino, ma farà quello che devi fare.

Vedere anche la mia risposta a una domanda simile: Load a DOM and Execute javascript, server side, with .Net che discute la tecnologia disponibile in .NET per farlo. La maggior parte dei pezzi esiste in questo momento, ma non ci sono ancora o non sono stati integrati nel modo giusto, sfortunatamente.

+0

La perdita di handle/memoria GDI + causata dal controllo WebBrowser è ciò che mi spinge a cercare alternative. Mi dispiace solo che non ci sia una soluzione adeguata a questo problema. – Aabela

+0

Bummer. Sì, questo è uno di quei posti che non è ancora lì, almeno se si tiene tutto all'interno di .NET. Se riesci a vivere con un'app ibrida, ci sono sicuramente dei modi per farlo, ma sarà più complicato. Continuo a sperare che qualcuno faccia il lavoro per creare un vero browser headless unificato interamente in .NET. Ma non è assolutamente un compito da poco. Come ho detto molti dei pezzi ci sono ma qualcuno ha bisogno di metterli insieme. –

3

È possibile utilizzare Awesomium per questo, http://www.awesomium.com/. Funziona abbastanza bene, ma non ha supporto per x64 e non è thread-safe. Lo sto usando per scansionare alcuni siti web 24x7 e funziona bene per almeno un paio di giorni consecutivi, ma di solito si blocca.