1

JavaScript、node.js、NightmareJS は初めてです。

Web ページからテキストを抽出するための簡単なスクリプトを以下に記述しました。それをファイルに保存したいと思います。

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

以下に示すエラーが表示され続けます。

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

1 に答える 1

3

内の関数の内容.evaluate()は、ブラウザー コンテキストで実行されます。そのため、定義した関数スコープには持ち上げfsられdataません。(変数リフティングの詳細については、.evaluate() こちらを参照してください。)

fs.write()意図したとおりに動作しません -fs.write()非同期です。

また、$(selector).text()あなたが望む結果が得られるとは思えません-それは各リンクからのリンクテキストを連結すると思います. それらを配列に入れたいと思いますか?

.run()さらに、直接サポートされていないことを指摘しておく必要があります。これは内部関数であり、主に互換性のために保持されています。

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

以上のことをすべて述べたので、開始するために例にパッチを当てましょう。すぐに、次のようなものが機能するはずです。

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);
})
于 2016-08-29T14:04:52.697 に答える