如何为返回的 table 中的每一行添加换行符?

How can I add a line break to each row in my returned table?

我正在使用网络抓取工具并成功打印了 table,但是 table 的格式很糟糕。

我以前尝试过一些东西

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

*Update 如果我在 CSV 预览器中打开文件,这就是我所看到的。我想要姓名,职位,办公室,年龄,开始日期,薪水在一行,然后所有返回的人(他们的名字办公室等)返回他们自己的一行。

有什么想法吗?

也许可以试试模板文字,它似乎适用于这个短循环。在您的情况下,您可能想尝试:

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

此代码中发生了一些不正确的解析和字符串操作,但修复起来非常简单:

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
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 = Array
      .from(peopleList)
      .map(entry => entry
        .innerText
        .replace(/\t/g, ',')
      )
    const header = Array
      .from(headerFields)
      .map(headerEntry => headerEntry
        .innerText
      )
      .join(',')

    return ([])
      .concat(header, people)
      .join('\n')
  })

  .end()

  .then(result => fs.writeFile(
      './testfile.csv',
      result,
      'utf8',
      function (err) {
        if (err) throw err;
        console.log('your file is saved')
      }
    )
  )
  .catch((err) => {
    console.error(err)
  });

首先,我们将错误处理程序更改为一个更真实的示例,每次都会将我们抛出到相同的 .catch 语句,并且可以接受调试器中断。

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

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

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