谷歌脚本刮取解析器与2个同名的类

时间:2017-09-18 02:18:56

标签: google-apps-script html-parsing

我希望在谷歌脚本中构建一个刮刀。有两个同名的classe,我找不到第二堂课的方法。它只输出第一个。

enter image description here

function myFunction() {
    var url = "https://www.zchocolat.com/shop/fr/livraison-cadeau-chocolat/espagne";
    var fromText = '<p class="article"';
    var toText = '">';

    var content = UrlFetchApp.fetch(url).getContentText();
    var scraped = Parser
                .data(content)
                .setLog()
                .from(fromText)
                .to(toText)
                .build();
    Logger.log(scraped);
    return scraped;
}

function SAVE_DATA() {
   var sheet = SpreadsheetApp.openById('').getSheetByName('Feuille 1'); 
   sheet.appendRow([ new Date(), myFunction() ]);

}

2 个答案:

答案 0 :(得分:4)

这个样本怎么样?

修改要点:

  1. 当它看到您在here使用的Parser库时,似乎可以使用iterate()将数据检索为数组。
  2. 您想要的数据是第二个。
  3. 当这些内容反映到您的脚本时,修改后的脚本如下所示。

    修改后的脚本:

    function myFunction() {
      var url = "https://www.zchocolat.com/shop/fr/livraison-cadeau-chocolat/espagne";
      var fromText = '<p class="article">';
      var toText = '</p>';
      var content = UrlFetchApp.fetch(url).getContentText();
      var scraped = Parser
                  .data(content)
                  .from(fromText)
                  .to(toText)
                  .iterate();
      Logger.log(scraped[1]);
      return scraped;
    }
    

    结果:

    97% de nos colis ont &eacute;t&eacute; livr&eacute;s dans les temps en 2016.
                                            zChocolat a d&eacute;j&agrave; livr&eacute; avec succ&egrave;s 21,923 cadeaux chocolat en Espagne.
    

答案 1 :(得分:3)

您应该使用XmlService解析html,以便您可以更轻松地提取所需的节点。这个网站有一些很好的例子(https://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html

你最终会得到类似的东西:

function myFunction() {
    var url = "https://www.zchocolat.com/shop/fr/livraison-cadeau-chocolat/espagne";
    var fromText = '<p class="article"';
    var toText = '">';

    var content = UrlFetchApp.fetch(url).getContentText();

    var doc = XmlService.parse(html);
    var html = doc.getRootElement();
    var articles = getElementsByClassName(html, 'articles');
    Logger.log(articles);
}

function getElementsByClassName(element, classToFind) {  
  var data = [];
  var descendants = element.getDescendants();
  descendants.push(element);  
  for(i in descendants) {
    var elt = descendants[i].asElement();
    if(elt != null) {
      var classes = elt.getAttribute('class');
      if(classes != null) {
        classes = classes.getValue();
        if(classes == classToFind) data.push(elt);
        else {
          classes = classes.split(' ');
          for(j in classes) {
            if(classes[j] == classToFind) {
              data.push(elt);
              break;
            }
          }
        }
      }
    }
  }
  return data;
}