我正在使用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预览器中打开文件,则将看到此内容。我想将姓名,职位,职务,年龄,开始日期,薪水放在一行上,然后让所有返回的人(以及他们的姓名办公室等)一行一行地返回。
答案 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`)
}