2015-09-02 1 views
1

Est-il possible d'obtenir le code HTML brut à partir d'une page Web en utilisant PhantomJS, avant que tout javascript est exécuté.Obtenez le contenu de la page brute avec PhantomJS

Le script suivant renvoie le code HTML une fois que tous les scripts ont été chargés et exécutés.

var webPage = require('webpage'); 
var page = webPage.create(); 

page.open('http://stackoverflow.com', function (status) { 
    var content = page.content; 
    console.log('Content: ' + content); 
    phantom.exit(); 
}); 

Existe-t-il un moyen d'accéder également à la source initiale de la page?

Répondre

3

DOMContentLoaded est l'événement le plus précoce qui est déclenché lors du chargement de la page, mais il semble qu'il soit déjà trop tard dans votre cas, car JavaScript peut être exécuté avant que DOMContentLoaded ne soit déclenché (pensez <script>doSomething();</script>).

L'idée suivante serait d'exécuter setInterval(check, 5);check tente de déterminer si le code HTML initial est complètement chargé, mais cela ne garantit pas qu'aucun autre JavaScript déjà couru et il est impossible de détecter si la page est chargée, parce que page.content inclut toujours </body></html>.

La solution la plus évidente serait de désactiver complètement le JavaScript avec page.settings.javascriptEnabled = false;, mais si vous faites cela, vous ne pourrez plus accéder au DOM. La seule façon d'y accéder, serait à travers page.content ou des propriétés similaires.

Si vous n'avez besoin que de la source de la page, n'utilisez pas PhantomJS pour cela. Il existe de nombreuses solutions pour cela, comme cURL.

+0

réponse fantastique. Je vous remercie! J'ai besoin d'accéder à la fois le HTML brut et le rendu (éventuellement modifié par javascript). Je vais utiliser cURL pour le premier, et PhantomJS pour le second. Il semble que ce ne soit pas possible avec une seule requête. –

0

Cela pourrait se faire via page.plainText:

var page=require('webpage').create(); 
page.onLoadFinished=function(status) { 
    if(status=='success') { 
     console.log(page.plainText); 
    } 
} 
page.load('http://stackoverflow.com');