如何在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实体(把<转成<,>转成>等转义字符还原) 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
相关产品推荐
相关产品推荐

