2017-05-03 1 views
-1

Ich möchte jquery in meinem Web-Scraping mit nightmare.js verwenden. Basierend auf this tutorial, kann ich nur inject die jquery kopieren und die Datei in den gleichen Stammordner kopieren. Aber irgendwie noch Fehler erhalte ich:

ReferenceError: $ is not defined

Unten ist mein 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' ist kopflos und ohne html, wie kann ich' jquery.js' zuerst einschließen? – sooon

Antwort

2

Um mit der Seite und ihre Variablen zu interagieren, werden Sie verwenden müssen .evaluate(fn):

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

.evaluate() ändert den Kontext der fn zu dem der Seite, so dass es ausgeführt werden kann, als ob es clientseitige Code ist, mit Zugriff auf die window, document, $ und alle anderen Globals.

Auch da Sie Version mit erwähnt haben 2.10, die .run() Funktion von 1.x-Versionen wurde von Promises ersetzt, so dass Sie .then() verwenden möchten werden und .catch() Erfolge und Fehler zu behandeln ist.

Für Ihre Schnipsel:

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

Die Readme-Projekt umfasst a few examples of this method chain.

+0

'npm list' zeigen meine Version ist' Albtraum @ 2.10.0'. Ich bin mir nicht sicher, wie 'evaluate()' funktioniert. Das Beispiel ist nicht sehr beschreibend. – sooon

+0

@sooon Ich habe meine Antwort aktualisiert, um mich auf v2.10 zu konzentrieren. –

Verwandte Themen