如何用JavaScript和Puppeteer将特定嵌套HTML表格转换为Excel/CSV
Puppeteer 提取无标识嵌套表格导出CSV方案
核心逻辑不依赖全量页面HTML拉取、不依赖content属性,直接基于目标表格的独有特征在DOM上下文精准定位,提取数据后直接生成标准CSV文件。
实现代码
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 替换为实际访问的目标页面地址 await page.goto('你的目标页面URL', { waitUntil: 'networkidle2' }); const csvContent = await page.evaluate(() => { // 遍历页面所有表格做特征匹配 const allTables = Array.from(document.querySelectorAll('table')); let targetTable = null; for (const table of allTables) { // 过滤规则1:排除带id、class属性的表格 if (table.id || table.getAttribute('class')) continue; // 取表格tbody下的直属tr const tbody = table.tBodies[0]; if (!tbody) continue; const rows = Array.from(tbody.querySelectorAll(':scope > tr')); // 过滤规则2:行数匹配29列对应行数 if (rows.length !== 29) continue; // 过滤规则3:每行固定包含2个td子元素 const structureValid = rows.every(tr => { const childNodes = Array.from(tr.children).filter(node => node.tagName === 'TD'); return childNodes.length === 2; }); if (structureValid) { targetTable = table; break; } } if (!targetTable) throw new Error('未匹配到符合特征的目标表格'); // 提取列名与对应值,做CSV格式转义 const headers = []; const rowValues = []; const dataRows = Array.from(targetTable.tBodies[0].querySelectorAll(':scope > tr')); dataRows.forEach(tr => { const [colCell, valCell] = tr.querySelectorAll('td'); // 转义双引号、处理特殊字符避免CSV格式错乱 const formatCell = (text) => `"${text.trim().replace(/"/g, '""')}"`; headers.push(formatCell(colCell.textContent)); rowValues.push(formatCell(valCell.textContent)); }); return `${headers.join(',')}\n${rowValues.join(',')}`; }); // 写入本地文件,添加BOM头兼容Excel打开不乱码 fs.writeFileSync('./table_export.csv', `\uFEFF${csvContent}`, 'utf-8'); await browser.close(); })();
注意事项
- 定位规则完全匹配描述的表格特征:无class无id、共29行数据、每行固定2个td,不会和页面内其他11个表格混淆。
- 代码自动处理了单元格内的逗号、双引号、换行符等特殊内容,不会出现CSV列错位问题。
- 如果实际场景下表格行数存在浮动,把
rows.length !== 29的判断调整为适配的范围即可,比如改为rows.length >= 20做宽松匹配。 - 导出的CSV文件可以直接用Excel打开,不需要额外转码。
内容的提问来源于stack exchange,提问作者Renato C.Francisco
相关产品推荐
相关产品推荐

