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

如何在Google Apps Script中处理POST请求响应,提取巴林招标网站公开招标数据生成二维数组

处理巴林招标页面API响应并提取数据的解决方案

你已经搞定了POST请求这步,很棒!接下来咱们重点拆解这个有点“绕”的响应格式——它返回的d字段是转义后的XML+HTML混合内容,咱们得一步步解码、解析,最终提取出和网页一致的表格数据。

完整的代码实现步骤

我把处理逻辑整合到你的代码里,每一步都加了注释:

function fetchData() { 
  var url = "https://www.tenderboard.gov.bh/Templates/TenderBoardWebService.aspx/GetOpenedTenderF"; 
  var formData = { 
    "tenderNumber":"", 
    "ministry":"0", 
    "category":"0", 
    "openedDate_filter":"", 
    "sortingType":"0", 
    "pageIndex":"1"  // 要前10条的话,这里改成1(API默认PageSize是10,第一页就是前10条)
  }; 
  var payload = JSON.stringify(formData); 
  var params = { 
    "method":"post", 
    "contentType":"application/json; charset=UTF-8", 
    "payload":payload,
    "muteHttpExceptions": true  // 加上这个方便调试请求异常
  }; 

  try {
    var response = UrlFetchApp.fetch(url, params);
    var jsonResponse = JSON.parse(response.getContentText());
    
    // 1. 提取响应里的d字段(转义后的XML内容)
    var rawEncodedData = jsonResponse.d;
    
    // 2. 解码HTML实体(把&lt;转成<,&gt;转成>等转义字符还原)
    var decodedXml = Utilities.xmlDecode(rawEncodedData);
    
    // 3. 解析XML结构,精准提取Content里的HTML表格内容
    var xmlDocument = XmlService.parse(decodedXml);
    var rootElement = xmlDocument.getRootElement();
    var pagerElement = rootElement.getChild('Pager');
    var contentHtml = pagerElement.getChild('Content').getText();
    
    // 4. 解析HTML表格,转换成二维数组
    var tenderData = parseTenderTable(contentHtml);
    
    // 打印结果,你可以改成存入Google Sheet或其他业务逻辑
    console.log(tenderData);
    return tenderData;
  } catch (error) {
    console.error("处理出错:", error.toString());
    return null;
  }
}

// 专门的表格解析函数,处理页面返回的div结构表格
function parseTenderTable(htmlContent) {
  var result = [];
  var columnRegex = /<div class='column'[^>]*>(.*?)<\/div>/g;
  
  // 先提取表头信息
  var headerMatch = htmlContent.match(/<div class='table-head'[^>]*>(.*?)<\/div>/);
  if (headerMatch) {
    var headers = [];
    var colMatch;
    while ((colMatch = columnRegex.exec(headerMatch[1])) !== null) {
      headers.push(colMatch[1].trim());
    }
    result.push(headers);
  }
  
  // 提取每一行的数据内容
  var rowRegex = /<div class='table-row'[^>]*>(.*?)<\/div>/g;
  var rowMatch;
  while ((rowMatch = rowRegex.exec(htmlContent)) !== null) {
    var rowData = [];
    columnRegex.lastIndex = 0; // 重置正则索引,避免漏匹配下一行的列
    var colMatch;
    while ((colMatch = columnRegex.exec(rowMatch[1])) !== null) {
      rowData.push(colMatch[1].trim());
    }
    result.push(rowData);
  }
  
  return result;
}

关键步骤说明

  • 解码HTML实体:用Utilities.xmlDecode()是Google Apps Script里最稳妥的方式,能一次性处理所有转义的HTML字符,不用自己写一堆replace逻辑。
  • XML解析:响应的d字段本质是XML结构,里面包含分页信息和HTML内容,用XmlService可以精准提取出我们需要的表格HTML片段。
  • HTML表格解析:因为返回的表格是用div模拟的(不是标准<table>标签),所以用正则匹配table-head和table-row类的div,再提取每个column里的文本内容,最终组装成和网页结构一致的二维数组。

注意事项

  • 把pageIndex改成1才能拿到前10条数据(API默认每页返回10条)。
  • 加上muteHttpExceptions: true可以在请求出错时拿到完整的错误信息,方便调试。
  • 如果后续网页的HTML结构有变化,可能需要调整正则表达式里的类名匹配规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:52:44