You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:13:10