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

如何用Google Script(结合Google Spreadsheet)正确抓取HTML页面?

使用Google Script + Google表格抓取HTML页面的正确方法

嘿,我来给你捋清楚怎么用Google Script结合Google表格抓取HTML页面,尤其是你给出的这种带特定class的表格结构的情况~

核心思路

先通过UrlFetchApp获取目标页面的HTML内容,然后解析出你需要的表格数据,最后把清洗好的数据写入Google表格。下面分步骤给你讲,还有现成的代码可以直接用。


步骤1:获取HTML内容

首先得用UrlFetchApp请求目标页面,这里要注意设置请求头模拟浏览器,不然很多网站会直接拦截你的请求(毕竟没人喜欢机器人乱爬)。

步骤2:解析目标表格

你给出的HTML里有个class="table table--decorated"的表格,我们可以用两种方法解析:

方法1:正则表达式(适合结构稳定的简单页面)

如果目标页面的表格结构不会经常变,正则是最直接的方式,不用额外依赖。直接匹配表格、行、单元格,然后清洗掉HTML标签。

方法2:XmlService解析(适合规范的HTML)

如果HTML是标准的XML格式(或者你能简单修复不规范的地方),用Google原生的XmlService会更健壮,不容易因为小的结构变动失效。


完整代码示例

下面是把两种方法结合的完整脚本,直接复制到Google Script编辑器里就能用,记得替换成你的目标URL和表格ID:

function fetchCurrencyRates() {
  // 替换成你的目标页面URL和Google表格ID
  const targetUrl = "这里填你要抓取的页面URL";
  const spreadsheetId = "你的Google表格ID";
  const activeSheet = SpreadsheetApp.openById(spreadsheetId).getActiveSheet();
  
  try {
    // 1. 发送请求获取HTML,模拟浏览器UA避免被拦截
    const requestOptions = {
      headers: {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
      }
    };
    const response = UrlFetchApp.fetch(targetUrl, requestOptions);
    const rawHtml = response.getContentText();
    
    // 2. 解析表格数据(这里用正则方法,你也可以换成XmlService方法)
    const tableData = parseTableWithRegex(rawHtml);
    
    // 3. 将数据写入表格
    if (tableData.length > 0) {
      activeSheet.clear(); // 清空原有内容
      const writeRange = activeSheet.getRange(1, 1, tableData.length, tableData[0].length);
      writeRange.setValues(tableData);
      SpreadsheetApp.getUi().alert("数据抓取成功,已经写入表格啦!");
    } else {
      activeSheet.getRange(1, 1).setValue("没找到目标表格或者有效数据哦");
    }
    
  } catch (error) {
    activeSheet.getRange(1, 1).setValue(`抓取出错啦:${error.message}`);
    console.error("错误详情:", error);
  }
}

// 用正则解析表格的辅助函数
function parseTableWithRegex(html) {
  // 匹配目标表格
  const tablePattern = /<table class="table table--decorated">([\s\S]*?)<\/table>/i;
  const tableMatch = html.match(tablePattern);
  if (!tableMatch) return [];
  
  const tableContent = tableMatch[1];
  const rows = [];
  
  // 匹配所有行
  const rowPattern = /<tr>([\s\S]*?)<\/tr>/gi;
  let rowMatch;
  while ((rowMatch = rowPattern.exec(tableContent)) !== null) {
    const cells = [];
    // 匹配每行的单元格(th或td)
    const cellPattern = /<(th|td)[^>]*>([\s\S]*?)<\/\1>/gi;
    let cellMatch;
    while ((cellMatch = cellPattern.exec(rowMatch[1])) !== null) {
      // 清洗单元格内容:去掉HTML标签,修剪空白
      const cleanText = cellMatch[2].replace(/<[^>]+>/g, "").trim();
      if (cleanText) cells.push(cleanText);
    }
    if (cells.length > 0) rows.push(cells);
  }
  
  return rows;
}

// 用XmlService解析表格的辅助函数(可选)
function parseTableWithXmlService(html) {
  // 简单修复不规范的HTML,转换成合法XML
  const cleanedHtml = html.replace(/<br>/g, "<br/>")
                          .replace(/<img([^>]+)>/g, "<img$1/>")
                          .replace(/<input([^>]+)>/g, "<input$1/>");
  
  try {
    const xmlDoc = XmlService.parse(cleanedHtml);
    const rootElement = xmlDoc.getRootElement();
    
    // 找到class匹配的表格
    const targetTables = rootElement.getDescendants().filter(node => {
      const element = node.getElement();
      return element && element.getAttribute("class")?.getValue() === "table table--decorated";
    });
    
    if (targetTables.length === 0) return [];
    
    // 提取tbody里的行和单元格
    const tbody = targetTables[0].getElement().getChildren("tbody")[0];
    return tbody.getChildren("tr").map(row => {
      return row.getChildren().map(cell => cell.getText().trim());
    });
    
  } catch (xmlError) {
    console.error("XML解析出错:", xmlError);
    return [];
  }
}

关键注意事项

  • 请求权限:第一次运行脚本时,需要授权允许脚本访问你的Google表格和发送网络请求,放心,这是Google的安全流程。
  • 反爬限制:不要频繁抓取同一个网站,建议用Google Script的时间触发器设置每天/每周抓取一次,避免被网站封禁IP。
  • 结构变动:如果目标网站更新了HTML结构(比如改了表格的class),记得及时调整正则或者XmlService的筛选条件。
  • 数据清洗:如果单元格里有特殊字符或者多余的空白,记得在清洗步骤里再加处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:40