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

使用Cheerio解析HTML表格生成CSV时无输出问题求助

嘿,我看你用Cheerio爬EPA台湾站的AQI表格转CSV,但代码没返回内容,咱们来一步步排查和修复这个问题~

首先,你的代码只写了allitems.each(function(index){...就断了,不过从现有部分来看,大概率是选择器不对或者异步逻辑没处理好,还有可能是网站拦截了默认的请求头。我给你整理了一份修正后的代码,顺便把常见坑都填上:

var request = require("request");
var cheerio = require("cheerio");
var fs = require("fs");
var url = "https://stat.epa.gov.tw/";

// 模拟浏览器请求头,避免被网站当成机器人拦截
var requestOptions = {
  url: url,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
  }
};

request(requestOptions, function(err, response, html) {
  // 先处理请求错误
  if (err) {
    console.error('请求网站时出错:', err);
    return;
  }

  // 检查HTTP状态码,确保请求成功
  if (response.statusCode !== 200) {
    console.error(`请求失败,状态码:${response.statusCode}`);
    return;
  }

  var $ = cheerio.load(html);
  // 先确认是否选中了目标表格——这一步很重要,避免白忙活
  var targetTable = $('table.tableAQI');
  if (targetTable.length === 0) {
    console.error('没找到class为tableAQI的表格!可能网站结构变了,或者选择器写错了');
    return;
  }

  var csvContent = [];
  // 第一步:提取表头
  var headers = [];
  targetTable.find('thead th').each(function() {
    headers.push($(this).text().trim());
  });
  csvContent.push(headers.join(','));

  // 第二步:提取表格内容行
  targetTable.find('tbody tr').each(function() {
    var rowData = [];
    $(this).find('td').each(function() {
      // 处理内容里的逗号和引号,避免CSV格式混乱
      var cellText = $(this).text().trim().replace(/"/g, '""');
      rowData.push(`"${cellText}"`);
    });
    csvContent.push(rowData.join(','));
  });

  // 第三步:写入CSV文件
  fs.writeFile('aqi_data.csv', csvContent.join('\n'), function(writeErr) {
    if (writeErr) {
      console.error('写入CSV文件出错:', writeErr);
    } else {
      console.log('搞定!数据已经写入aqi_data.csv啦');
    }
  });
});

几个关键修复点:

  • 请求头模拟:很多网站会拦截没有User-Agent的请求,加上浏览器的UA能避免被当成机器人
  • 选择器优化:直接用table.tableAQI thead th和tbody tr定位表头和内容行,比嵌套children()更可靠,因为表格结构一般是thead/tbody包裹行
  • 错误排查环节:每一步都加了检查(比如是否找到表格、请求是否成功),方便你快速定位问题
  • CSV格式处理:对单元格里的逗号和引号做了转义,避免生成的CSV打开后格式错乱

额外提醒:

如果运行后还是没数据,你可以在var $ = cheerio.load(html);后面加一行console.log(html),看看返回的HTML是不是你在浏览器里看到的内容——要是网站用JavaScript动态加载表格,那Cheerio就抓不到了(因为Cheerio只能解析静态HTML),这时候就得换用Puppeteer这类能模拟浏览器的工具啦。

内容的提问来源于stack exchange,提问作者midnight_raver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:12:45