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

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);
  }
}

修改说明

  1. 按商品容器提取:先匹配每个商品的外层容器ui-search-result__wrapper,确保所有字段都从同一个商品容器内提取,彻底避免错位问题。
  2. 字段容错处理:每个字段提取时都做了存在性判断,避免因某个字段缺失导致脚本报错。
  3. 评分逻辑优化:直接在当前商品容器内查找评分信息,有则提取,无则显示“X”,完美匹配对应商品。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:22