如何将数据从cheerio写入文件

时间:2019-05-30 20:32:08

标签: fs cheerio

我正在用cheerio抓取文件目录,并且需要所有这些数据以一个.json文件结尾。

我可以将所有数据很好地进行控制台。我看到了我需要的所有内容,当我尝试将其写入文件时,我一无所有,或者只有一个文件。我已经尝试过async / await,promise,fs.writeFile和fs.createFileStream。我现在很困惑。

const fs = require('fs');
const cheerio = require('cheerio');
const { findContent } = require('./getItems.js');
const writeStream = fs.createWriteStream('data.json');


const FileHound = require('filehound');

const files = FileHound.create()
    .paths('./public')
    .ext('html')
    .find((err, noFilesFound) => {
        if (err) {
            console.log(error);
        } else {
            console.log(noFilesFound)
        }
    })
    .then(files => {
        files.forEach(function (file) {
            fs.readFile(file, 'utf-8', function (err, data) {
                if (err) {
                    throw err;
                } else {
                    const items = [];
                    var $ = cheerio.load(data)
                    const result = findContent($, true);

                    console.log(result);

                    items.push(JSON.stringify(result))
                }
            })
        })
    })

这可以满足我的所有需求。

我不知道如何写数据

writeStream.write(items,'UTF8'); 

我收到大块错误消息,或者未定义项,...

2 个答案:

答案 0 :(得分:0)

这是因为要在回调中添加它们。像这样尝试:

let items = [];
let $
let data
let result

;(async function(){
  let files = await glob(...)
  for(var file of files){
    data = fs.readFileSync(file)
    $ = cheerio.load(data)
    result = findContent($, true);
    console.log(result);
    items.push(result)
  }  
  fs.writeFileSync(filename, JSON.stringify(items))
})()

答案 1 :(得分:0)

我不知道为什么,但是现在看来这行得通。

const fs = require('fs');
const cheerio = require('cheerio');
const { findContent } = require('./getItems.js');
const writeStream = fs.createWriteStream('data.json', 'utf8');
const FileHound = require('filehound');



const files = FileHound.create()
    .paths('./public')
    .ext('html')
    .find((err, htmlFiles) => {
        if (err) return console.error('handle err', err);
        htmlFiles.forEach(function (file) {
            fs.readFile(file, 'utf-8', function (err, data) {
              if (err) {
                throw err;
              } else {
                var items = [];
                var $ = cheerio.load(data)
                const result = findContent($, true);
                items.push(result)
                writeStream.write(JSON.stringify(items));
              }
            })
          })
        })

和glob

const fs = require('fs');
const cheerio = require('cheerio');
const { findContent } = require('./getItems.js');
const writeStream = fs.createWriteStream('data.json', 'UTF8');

const glob = require('glob');

glob('./public' + '/**/*.html', {}, (err, files) => {
  if (err) {
    console.log('error finding files')
  } else {
    files.forEach(function (file) {
      fs.readFile(file, 'utf-8', function (err, data) {
        if (err) {
          throw err;
        } else {
          var items = [];
          var $ = cheerio.load(data)
          const result = findContent($, true);
          items.push(result)
          writeStream.write(JSON.stringify(items));
        }
      })
    })
  }
})