私はこれをstackoverflow/googleで検索しましたが、理解できないようです。
特定のURLページのソーシャルメディアリンクをスクレイピングしています。この関数は、URLのリストを含むオブジェクトを返します。
このデータを別のファイルに書き込もうとすると、期待されるのではなく[object Object]
としてファイルに出力されます:[' https://Twitter.com/#!/101Cookbooks ' 、 ' http://www.facebook.com/101cookbooks ']は、結果をconsole.log()
した場合と同じです。
これはNodeでファイルを読み書きする私の悲しい試みで、各行(URL)を読み取って、関数呼び出しrequest(line, gotHTML)
を介して入力しようとします。
fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
console.log(line);
var obj = request(line, gotHTML);
console.log(obj);
fs.writeFileSync('./data.json', obj , 'utf-8');
});
参照用-gotHTML
関数:
function gotHTML(err, resp, html){
var social_ids = [];
if(err){
return console.log(err);
} else if (resp.statusCode === 200){
var parsedHTML = $.load(html);
parsedHTML('a').map(function(i, link){
var href = $(link).attr('href');
for(var i=0; i<socialurls.length; i++){
if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
social_ids.Push(href);
};
};
})
};
return social_ids;
};
obj
は、この例の配列です。
fs.writeFileSync(filename、data、[options])には、dataパラメーターにString
またはBuffer
のいずれかが必要です。 ドキュメントを参照 。
配列を文字列形式で書き込もう:
// writes 'https://Twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8');
または:
// writes ['https://Twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');
編集:あなたの例で配列が表示される理由は、ノードのconsole.log
の実装がtoString
を呼び出すだけでなく、util.format
を呼び出すためです console.jsソースを参照 =
Deb2fastが言ったことに基づいて、JSON.stringify()にいくつかの追加のパラメーターを渡して、きれいな形式にすることもできます。
fs.writeFile('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');
2番目のパラメーターはオプションの置換関数で、この場合は必要ないため、null
が機能します。
3番目のパラメーターは、インデントに使用するスペースの数です。 2と4が一般的な選択肢のようです。
[object object]
を取得している場合は、JSON.stringify
を使用します
fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');
それは私のために働いた。
私の経験では、JSON.stringifyはutil.inspectよりわずかに高速です。 DB2クエリの結果オブジェクトをjsonファイルとして保存する必要がありました。クエリから92k行のオブジェクトが返され、util.inspectで変換が完了するまでに非常に時間がかかったため、同じ1000レコードオブジェクトを記述して次のテストを行いました両方の方法でファイルに。
JSON.Stringify
fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
時間:3:57(3分57秒)
結果の形式:
[
{
"PROB": "00001",
"BO": "AXZ",
"CNTRY": "649"
},
...
]
util.inspect
var util = require('util');
fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
時間:4:12(4分12秒)
結果の形式:
[ { PROB: '00001',
BO: 'AXZ',
CNTRY: '649' },
...
]
jSON.stringify(obj);を試してみてください。
このような
var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8');
他の誰かがこれに遭遇した場合に備えて、ノードでfs-extraライブラリを使用し、javascriptオブジェクトを次のようなファイルに書き込みます。
const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);