2017-05-03 5 views
-1

Je souhaite utiliser jquery dans ma webgrapping avec nightmare.js. Basé sur this tutorial, je peux simplement inject le jquery et copier le fichier dans le même dossier racine. Mais de toute façon, je comprends toujours l'erreur:

ReferenceError: $ is not defined

Voici mon code:

var Nightmare = require('nightmare'); 

new Nightmare() 
    .goto('http://google.com') 
    .inject('js', 'jquery.min.js') 
    .wait() 
    .run(function(err, nightmare) { 
    if (err) { 
     console.log(err); 
    }; 

    var items = []; 

    $('.someclass').each(function(){//<-- error - $ not defined 
     item = {}; 
     item.value = $(this).val(); 
     items.push(item); 
    }); 
    console.log(items); 
    }); 
+0

'nightmare.js' est sans tête et sans html, comment puis-je inclure' jquery.js' en premier? – sooon

Répondre

2

Pour être en mesure d'interagir avec la page et ses variables, vous devez utiliser .evaluate(fn):

Invokes fnon the page with arg1, arg2,... .

.evaluate() modifie le contexte du fn à celui de la page, afin qu'il puisse être exécuté comme s'il s'agissait d'un code côté client, avec accès au window, document, $ et tous les autres globaux.

En outre, étant donné que vous avez mentionné en utilisant la version 2.10, la fonction .run() des versions 1.x a été remplacée par Promises, de sorte que vous aurez envie d'utiliser .then() et .catch() pour gérer les succès et les erreurs, respectivement.

Pour votre extrait:

new Nightmare() 
    .goto('http://google.com') 
    .inject('js', 'jquery.min.js') 
    .wait() 
    .evaluate(function() { 
    var items = []; 

    $('.someclass').each(function(){ 
     item = {}; 
     item.value = $(this).val(); 
     items.push(item); 
    }); 

    console.log(items); 
    }) 
    .then(function() { 
    console.log('Done'); 
    }); 
    .catch(function (err) { 
    console.log('Error', err); 
    }); 

le readme du projet comprend a few examples of this method chain.

+0

'npm list' montre que ma version est' nightmare @ 2.10.0'. Je crois que je ne suis pas sûr de savoir comment 'evaluate()' fonctionne. L'exemple n'est pas très descriptif. – sooon

+0

@sooon J'ai mis à jour ma réponse pour me concentrer sur la v2.10, alors. –