如何在我返回的表的每一行中添加一个换行符?

时间:2018-07-23 18:40:26

标签: javascript node.js web-scraping fs nightmare

我正在使用Web刮板,并且可以成功打印表格,但是表格的格式很糟糕。

我之前已经尝试过几件事

1) const people = [...peopleList].map(personEntry => personEntry.innerText + '\n")

2) const people = [...peopleList].map(personEntry => personEntry.innerText).join("\n")

3)  .then(result => fs.writeFile('testfile.csv',JSON.stringify(result + "\n"),'utf8', function(err) {

我很沮丧,我认为解决方案可能涉及一个循环并将其附加,但我不是100%积极的。

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: false  })
const fs = require('fs');


nightmare
  .goto('https://www.google.com/')
  .type('#lst-ib', 'datatables')
  .click('input[value= "Google Search"]')
  .click('.rc >.r > a')
  .select('select[name="example_length"]',"100")


  .evaluate(function() {
    const headerFields = document.querySelectorAll("#example thead tr th")
    const peopleList = document.querySelectorAll("#example tbody tr");
    const people = [...peopleList].map(personEntry => personEntry.innerText)
    const header = [...headerFields].map(headerEntry => headerEntry.innerText)

    return {
      log: header,
      list: people
    }
  })

  .end()

  .then(result => fs.writeFile('testfile.csv',JSON.stringify(result),'utf8', function(err) {
    if (err) {
      console.log('File not saved or corrupt');
    } else {
      console.log('your file is saved')
    }
  }))
  .catch(error =>{
    console.error('fail')
  })

*更新,如果我在CSV预览器中打开文件,则将看到此内容。我想将姓名,职位,职务,年龄,开始日期,薪水放在一行上,然后让所有返回的人(以及他们的姓名办公室等)一行一行地返回。

shows all elements on the same row What the csv looks like right now 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

此代码中发生了一些不正确的解析和字符串操作,但这是一个很简单的解决方法:

import _  from 'lodash';
const output = content.map((row) => _.zipObject(row, header));

首先,我们将错误处理程序更改为更实际的示例,该示例将每次将我们置于相同的.catch语句中,并可以接受调试器中断。

接下来,我们将写入文件更改为写入原始字符串,这样它将实际输出CSV而不是JSON字符串(这将导致所有内容都在同一行上)

最后,我们更改评估回调,将nodeList(s)转换为Array,然后进行转换,并最终用换行符将它们全部连接起来。

您可能会遇到的唯一问题是计时问题,因此某些等待语句可能正是您想要的。

答案 1 :(得分:0)

也许尝试使用模板文字,它似乎可以在此短循环中使用。您可能需要尝试以下方法:

const people = [...peopleList].map(personEntry => {`${personEntry.innerText} \n`})

示例循环:

for (var i=0; i<5; i++){
  console.log(`This is ${i} times through \n More Text On Next Line`) 
}