Google Apps Script表格网页抓取字段匹配异常问题求助
问题描述
使用Google Apps Script抓取Mercado Libre乌拉圭站点时,可正确提取商品名称、价格、链接,但部分商品无评分/评论数,导致评分和评论数字段与商品匹配错位,希望无评分时显示“X”,确保各字段与对应商品正确关联。
原代码
function webScrapingPP() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buscador Palabras Claves"); var keyword = sheet.getRange("B3").getValue(); var baseUrl = "https://listado.mercadolibre.com.uy/" + keyword + "_OrderId_PRICE_ITEM*CONDITION_2230284_NoIndex_True"; var response = UrlFetchApp.fetch(baseUrl); var content = response.getContentText(); var namePattern = /<h2 aria-level="3" class="ui-search-item__title">([^<]+)<\/h2>/g; var pricePattern = /<span class="andes-visually-hidden">(\d+)\s*pesos<\/span>/g; var linkPattern = /<a href="([^"]+)" class="ui-search-item__group__element ui-search-link"/g; var ratingPattern = /<span class="andes-visually-hidden">Calificación ([\d.]+) de 5. (\d+) opiniones.<\/span>/g; var names = content.match(namePattern); var prices = content.match(pricePattern); var links = content.match(linkPattern); var ratings = content.match(ratingPattern); var data = []; if (names && prices && links) { for (var i = 0; i < Math.min(names.length, prices.length, links.length); i++) { var name = names[i].match(/<h2 aria-level="3" class="ui-search-item__title">([^<]+)<\/h2>/); var price = prices[i].match(/(\d+ pesos)/); var link = links[i].match(/href="([^"]+)"/); // Check if there is a matching rating and review count var rating = "X"; var reviewCount = "X"; if (ratings && ratings[i]) { var ratingMatch = ratings[i].match(/Calificación ([\d.]+) de 5. (\d+) opiniones/); if (ratingMatch && ratingMatch.length >= 3) { rating = ratingMatch[1]; reviewCount = ratingMatch[2]; } } // Add the data to the array data.push([name[1], price[0], link[1], rating, reviewCount]); } } // Write the data to the sheet from row 6 onwards sheet.getRange(6, 2, data.length, 5).setValues(data); }
当前抓取结果
无评分的商品对应的评分/评论数字段被后续有评分商品的信息填充,导致字段匹配错位,例如前几个无评分商品显示了后面商品的评分和评论数。
期望抓取结果
所有无评分的商品,评分和评论数字段显示“X”;有评分的商品对应正确的评分值和评论数,各字段与商品一一对应,无错位。
目标抓取链接
https://listado.mercadolibre.com.uy/banera-spa-tina-portatil-plegable-inflable-pvc_OrderId_PRICE_ITEM*CONDITION_2230284_NoIndex_True
关键词示例:banera spa tina portatil plegable inflable pvc(可折叠充气PVC SPA浴缸)
解决方案
问题根源是独立匹配各个字段的正则表达式,未按商品单元关联数据。当部分商品无评分时,ratings数组长度小于其他字段数组,直接按索引i匹配会导致错位。正确做法是先定位每个商品的容器节点,再在每个容器内提取对应字段。
修改后的代码如下:
function webScrapingPP() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Buscador Palabras Claves"); var keyword = sheet.getRange("B3").getValue(); var baseUrl = "https://listado.mercadolibre.com.uy/" + keyword + "_OrderId_PRICE_ITEM*CONDITION_2230284_NoIndex_True"; var response = UrlFetchApp.fetch(baseUrl); var content = response.getContentText(); // 匹配每个商品的容器节点 var itemContainerPattern = /<div class="ui-search-result__wrapper"[\s\S]*?<\/div>/g; var itemContainers = content.match(itemContainerPattern); var data = []; if (itemContainers) { itemContainers.forEach(function(container) { // 提取商品名称 var nameMatch = container.match(/<h2 aria-level="3" class="ui-search-item__title">([^<]+)<\/h2>/); var name = nameMatch ? nameMatch[1] : "N/A"; // 提取商品价格 var priceMatch = container.match(/<span class="andes-visually-hidden">(\d+)\s*pesos<\/span>/); var price = priceMatch ? priceMatch[0] : "N/A"; // 提取商品链接 var linkMatch = container.match(/<a href="([^"]+)" class="ui-search-item__group__element ui-search-link"/); var link = linkMatch ? linkMatch[1] : "N/A"; // 提取评分和评论数 var rating = "X"; var reviewCount = "X"; var ratingMatch = container.match(/<span class="andes-visually-hidden">Calificación ([\d.]+) de 5. (\d+) opiniones.<\/span>/); if (ratingMatch && ratingMatch.length >=3) { rating = ratingMatch[1]; reviewCount = ratingMatch[2]; } data.push([name, price, link, rating, reviewCount]); }); } // 写入表格,从第6行第2列开始 if (data.length > 0) { sheet.getRange(6, 2, data.length, 5).setValues(data); } }
修改说明
- 按商品容器提取:先匹配每个商品的外层容器
ui-search-result__wrapper,确保所有字段都从同一个商品容器内提取,彻底避免错位问题。 - 字段容错处理:每个字段提取时都做了存在性判断,避免因某个字段缺失导致脚本报错。
- 评分逻辑优化:直接在当前商品容器内查找评分信息,有则提取,无则显示“X”,完美匹配对应商品。
内容的提问来源于stack exchange,提问作者Franco Vera
相关产品推荐
相关产品推荐

