2016-08-26 3 views
1

Je suis nouveau sur JavaScript, node.js et NightmareJS.Comment écrire des données de NightmareJS dans le fichier

J'ai écrit un script simple ci-dessous pour extraire du texte d'une page Web, et je voudrais l'enregistrer dans un fichier.

var nightmare = require('nightmare'); 
var data = []; 
var fs = require('fs'); 

var usda = new nightmare() 
.goto('yyyy') 
.wait(20000) 
.inject('js', 'jquery.js') 
.evaluate(function(){ 
    data = $x('//a').text(); 
    fs.write("testOutput.json", JSON.stringify(data), 'w'); 
}) 
.end() 
.run(function (err, nightmare) { 
    if (err) return console.log(err); 
    console.log('Done!'); 
}); 

Je continue à obtenir l'erreur ci-dessous:

return binding.writeString(fd, buffer, offset, length, req); 
      ^
TypeError: First argument must be file descriptor 
+0

Merci d'avoir signalé l'erreur de syntaxe @ArtjomB. – ProfLonghair

Répondre

3

Contenu de la fonction à l'intérieur de .evaluate() sont exécutés dans le contexte du navigateur. En tant que tel, fs et data ne seront pas levés dans la portée de fonction que vous avez définie. (Vous pouvez en savoir plus sur le levage variable et .evaluate()here.)

fs.write() ne fonctionnera pas comme vous avez l'intention - fs.write() is asynchronous.

Aussi, je doute $(selector).text() va donner les résultats que vous voulez - je pense que concaténer le texte du lien de chaque lien ensemble. Je suspect vous les voulez dans un tableau? En outre, je dois souligner que .run() isn't directly supported. C'est une fonction interne, conservée principalement pour des raisons de compatibilité. Enfin, il semblerait que vous utilisiez une version personnalisée de jQuery ou une bibliothèque tierce pour obtenir le support de XPath. À l'avenir, il serait utile d'inclure cette information.

Tout cela étant dit, réparons votre exemple pour vous aider à démarrer. En dehors du brassard, quelque chose comme ça devrait fonctionner:

var nightmare = require('nightmare'); 
var fs = require('fs'); 

var usda = new nightmare() 
.goto('yyyy') 
.wait(20000) 
.inject('js', 'jquery.js') 
.evaluate(function(){ 
    //using 'a', but this could be swapped for your xpath selector 
    return $('a').toArray().map((a) => $(a).text()); 
}) 
.end() 
.then(function(anchors){ 
    fs.writeFileSync('testOutput.json', JSON.stringify(anchors)); 
    console.log('Done!'); 
}); 
.catch(function(err){ 
    console.log(err); 
}) 
+0

Merci beaucoup @Ross. Votre réponse a bien fonctionné. Je n'utilisais pas une bibliothèque jquery personnalisée. Je ne savais pas au moment de la publication que seuls les sélecteurs CSS3 étaient compatibles avec le code jquery. – ProfLonghair