Как записать данные из cheerio в файл - PullRequest
0 голосов
/ 30 мая 2019

Я очищаю каталог файлов с помощью cheerio и мне нужно, чтобы все эти данные оказались в одном файле .json.

Я могу нормально перенести все свои данные в консоль.Я вижу все, что мне нужно, и когда я пытаюсь записать это в файл, у меня ничего не получается, или один файл.Я пробовал async / await, обещания, fs.writeFile и fs.createFileStream.Я сейчас очень смущен.

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


const glob = require('glob');

glob('./public' + '/**/*.html', {}, (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);

                    console.log(result);

                    items.push(JSON.stringify(result))
                    console.log(items.toString());

                }
            })

        })
    });

Это утешает все, что мне нужно.

Я не могу понять, как записать свои данные

writeStream.write(items,'UTF8'); 

Я получаю сообщения об ошибках, или элементы не определены, ...

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Не знаю почему, но сейчас это похоже на работу.

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

и с шариком

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));
        }
      })
    })
  }
})
0 голосов
/ 03 июня 2019

Это потому, что вы добавляете их в обратный вызов. Попробуйте это так:

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))
})()
...