2016-08-26 13 views
1

JavaScript、node.js、NightmareJSを初めて使用しています。NightmareJSからファイルにデータを書き込む方法

ウェブページからテキストを抽出するための簡単なスクリプトを作成しましたが、ファイルに保存したいと思います。

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

私はエラーを以下に示し得続ける:.evaluate()の内部

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

構文エラー@ArtjomBを指摘してくれてありがとう。 – ProfLonghair

答えて

3

機能の内容は、ブラウザのコンテキストで実行されています。したがって、fsdataは、定義した関数スコープに持ち込まれることはありません。 (可変リフトの詳細については、.evaluate()hereを参照してください。

fs.write()は、意図したとおりに動作しません。fs.write() is asynchronous

また、私は$(selector).text()があなたが望む結果を生み出すのではないかと疑います。私は、各リンクのリンクテキストをつなぎ合わせると思います。私は容疑者あなたは配列でそれらをしたいですか?

さらに、私は.run() isn't directly supportedを指摘しておきます。ほとんどの場合互換性のために保持されている内部関数です。

最後に、jQueryのカスタムビルドまたはサードパーティ製のライブラリのいずれかを使用してXPathをサポートしているように見えます。将来、その情報を含めると便利です。

すべてのことが、あなたのサンプルをアップして始めてみましょう。カフを外して、このようなものがうまくいくはずです:

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

ありがとう@ロス。あなたの答えは素晴らしいものでした。 私はカスタムjqueryライブラリを使用していませんでした。投稿時点で、CSS3セレクタだけがjqueryコードと互換性があることはわかりませんでした。 – ProfLonghair

関連する問題