如何为返回的 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) 转换为数组,然后进行转换,并最终用换行符将它们全部连接起来。
您可能 运行 遇到的唯一问题是计时问题,因此某些等待语句可能正是您想要的。
我正在使用网络抓取工具并成功打印了 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) 转换为数组,然后进行转换,并最终用换行符将它们全部连接起来。
您可能 运行 遇到的唯一问题是计时问题,因此某些等待语句可能正是您想要的。