使用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
相关产品推荐
相关产品推荐

