如何用JavaScript写入文本文件?爬虫写入后换行问题求助
解决爬虫数据写入文件的两个问题:显示"object"与换行输出
嘿,很高兴看到你已经搞定了写入文件的基础问题!作为编程新手遇到这种情况太正常了,咱们一步步把两个问题说清楚,帮你彻底明白背后的逻辑~
一、为什么一开始文件里全是"object"?
你最初遇到的问题,是因为fs.writeFile没办法直接把JavaScript对象/数组写入文件——它只认字符串或者Buffer。当你直接把companies(一个包含对象的数组)传进去时,Node.js会自动调用数组的toString()方法,而数组里的每个对象转成字符串就是[object Object],所以你看到的就是一堆重复的这个内容。
解决这个问题的核心,就是把你的数据转换成字符串格式,常用的方式有两种:
- 用
JSON.stringify()把对象转成JSON字符串(适合后续要再用代码解析的场景) - 自定义格式化字符串(适合人类直接阅读的场景)
二、如何让每一行数据换行显示?
现在你已经能写入文件了,要实现换行,只需要把每个公司的数据单独转成字符串,然后用换行符\n把它们拼接起来就行。下面给你两种常用的实现方式:
方式1:输出JSON格式(每行一个公司对象)
这种方式适合后续还要用代码读取解析数据的场景,修改你的main函数如下:
async function main() { const url = 'https://www.lseg.com/resources/1000-companies-inspire/2018-report-1000-companies-uk/search-1000-companies-uk-2018?results_per_page=100'; const companies = await scrape(url); // 把每个公司对象转成JSON字符串,再用换行符连接 const outputContent = companies.map(company => JSON.stringify(company)).join('\n'); fs.writeFile('Output.txt', outputContent, (err) => { if (err) throw err; console.log('写入完成!') }) console.log(companies); }
方式2:输出易读的自定义格式(每个字段占一行)
如果希望文件内容更适合人类阅读,可以自定义每个公司的显示格式,比如每个字段单独一行,公司之间空一行:
async function main() { const url = 'https://www.lseg.com/resources/1000-companies-inspire/2018-report-1000-companies-uk/search-1000-companies-uk-2018?results_per_page=100'; const companies = await scrape(url); // 自定义每个公司的显示格式 const outputContent = companies.map(company => { // 把对象的键值对转成"键: 值"的格式,每个字段一行 const companyLines = Object.entries(company).map(([key, value]) => `${key}: ${value}`); // 每个公司的内容后加两个换行,区分不同公司 return companyLines.join('\n') + '\n\n'; }).join(''); fs.writeFile('Output.txt', outputContent, (err) => { if (err) throw err; console.log('写入完成!') }) console.log(companies); }
额外小提示:用异步版本的fs.writeFile更贴合你的代码风格
你的代码里已经用了async/await,其实可以用fs.promises.writeFile来代替回调版本,代码会更整洁:
// 替换原来的fs.writeFile部分 await fs.promises.writeFile('Output.txt', outputContent); console.log('写入完成!');
这样就不用嵌套回调,和你整体的async/await风格保持一致啦~
内容的提问来源于stack exchange,提问作者EdnaMae
相关产品推荐
相关产品推荐

