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

如何使用Puppeteer自动抓取HTML表格指定列的行数据?

实现方案

不要硬编码绝对XPath逐元素定位,直接在页面上下文里批量遍历表格行,按列索引做过滤即可,代码可复用性和稳定性远高于手动逐元素写选择器。

核心逻辑:

  • 放弃从html根节点开始的长绝对XPath,维基百科的结构化数据表格默认带有wikitable类名,用类名选择器定位表格,不会因为页面层级微调就失效。
  • 统一遍历表格所有行,同时兼容表头的<th>单元格和数据区的<td>单元格。
  • 按配置的列索引提取需要保留的单元格内容,自动跳过不需要的列,同时过滤空行、清理文本前后的多余空白和换行。

可直接运行的代码示例

const puppeteer = require('puppeteer');

async function scrapewiki(url) {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    // 等待DOM加载完成即可执行提取,不需要等所有静态资源加载,爬取速度更快
    await page.goto(url, { waitUntil: 'domcontentloaded' });

    // 配置要保留的列索引,索引从0开始计数:0对应第1列,2对应第3列,自动跳过索引为1的第2列
    const keepColumns = [0, 2];
    
    const tableData = await page.evaluate((keepCols) => {
        const table = document.querySelector('table.wikitable');
        if (!table) return [];

        const result = [];
        const allRows = table.querySelectorAll('tr');
        
        for (const row of allRows) {
            const allCells = Array.from(row.querySelectorAll('th, td'));
            // 按配置提取对应列的内容,自动处理单元格不存在的边界情况
            const filteredCells = keepCols.map(colIdx => allCells[colIdx]?.textContent.trim() ?? '');
            // 跳过全空的无效分隔行
            if (filteredCells.some(cellVal => cellVal.length > 0)) {
                result.push(filteredCells);
            }
        }
        return result;
    }, keepColumns);

    // 输出的tableData为二维数组:第一行是过滤后的表头,后续行是对应的数据,可直接存入数据库
    console.log(tableData);

    await browser.close();
    return tableData;
}

使用提示

  • 调整保留列只需要修改keepColumns数组的索引值即可,比如要保留第1、4、5列,直接改成[0, 3, 4],不需要改动其他逻辑。
  • 如果当前页面存在多个wikitable,只需要给querySelector传入更精确的选择器即可,比如定位到对应内容板块的容器后再查找内部表格,比逐行逐列写XPath的效率高10倍以上。
  • 提取出的结果已经做了基础的文本清洗,不需要额外处理格式就可以直接用于后续的对比分析、可视化环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:18:43