UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【GAS】Webスクレイピング(その2)- HTMLをDOMにパース

前回に引き続いてGASでWebスクレイピングを行う

やること

  • GASでHTMLを取得
  • HTMLをDOMにパースしてセレクターを使ってテキストを取得する
  • SpreadSheetの特定のセルに値をセットする

GASでHTMLを取得

UrlFetchAppクラスのfetchを使う

    var url = [サイトのURL];
    var response = UrlFetchApp.fetch(url);
    var html = response.getContentText('UTF-8');

HTMLをDOMにパースしてセレクターを使ってテキストを取得する

結構GASで使えるDOM Paserを探すのに苦労したが、こちら記事で紹介されているcheerioのGAS版があって助かった

cheerio-gasifyをつくった - 3846masa's memo

使いかたはcheerioと一緒で、querySelectorAllで使った場合の以下の処理を

var output = [];
document.querySelectorAll("#datatable .data-row").forEach(row => {
  var list = [];
  row.querySelectorAll(".col-xs-3 .row").forEach(childRow => {
    list.push(childRow.textContent)
  })
  row.querySelectorAll(".col-xs-8 .row .details").forEach(childRow => {
    list.push(childRow.textContent)
  })
  output.push(list);
});

GASでこのように書くことができる

var url = [サイトのURL];
var response = UrlFetchApp.fetch(url);
var html = response.getContentText('UTF-8');
var cheerio = cheeriogasify.require('cheerio');
var $ = cheerio.load(html);
$("#datatable .data-row").each(function () {
  var list = [];
  $(".col-xs-3 .row", this).each(function () {
    list.push(this.text());
  })
  $(".col-xs-8 .row .details").each(function () {
    list.push(this.text());
  })
  output.push(list);
}

あとはセルに値をセットして終わり

その3へ