🛴

GASでAtomを扱うことになった時のメモ

2024/12/13に公開

はじめに

スクレイピングして情報収集するツールをGoogleスプレッドシートとGASで作ることになったんだけど、HTMLを解析して収集するのはひとまず後回しにして、RSSとかあるサイトを手はじめにやっていこう‥ということになって、RSSのサイトはまあ別にブラウザRSSを目視で必要なキーなどを抜き出すことができたんだけど、Atomの場合にはちょっとやっかいで、ブログ記事とかでどうにか‥って思って見様見真似でそれなりに動く感じにはできたんだけど、結局細かいところとか、何ができそうか‥みたいなのは把握できてないので、把握する際にやったことのメモなど。

GASでAtomやRSSを扱うときの概要

基本的には以下の手順を踏みます

  1. データ取得
  2. デコード
  3. パース
  4. エレメントのよりわけ
  5. データ加工
  6. 出力・リターン

データの取得・デコード・パース

データの取得には、UrlFetchApp.fetch()を使います
デコードには、getContentText()を使います。

data = UrlFetchApp.fetch(url).getContentText('UTF-8');

パースは、XmlService.parse()で処理します。

xml = XmlService.parse(data);

エレメントのよりわけ

まず、中身をごっそり取り出します。

root = xml.getRootElement();

Atomの場合はネームスペースを取り出しておきます。

atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');

getChildgetChildrenで中身をとりだします。

entries = root.getChildren('entry', atom);

中身がわからんのでは?

entryとかどうやって知るの?」
と思うかもですが、仕様がきまっていて、ざっくりとわかります。
だだめんどいので、他のブログ記事などを参考にあてずっぽうで指定してはエラーを出してみてって感じでやってたのですが、もってきたデータに入っているものをちゃんと確認してからやったほうがよさげです。

なので、1レコード分の中身をみてみます。

Logger.log(entries[0].getChildren());

すると、id, published,updated,title,category,content,link,media:thumbnail,thr:totalとかがあって、とくにcategory,linkは複数あるのがわかったので、もうすこし細かくみてみます。
この段階になると、これ以上深い階層に子要素はないので、getAttributes()で取り出します。

for (let item of entries[0].getChildren('link', atom)){
    Logger.log(item.getAttributes()); 
}

categoryにはschemetermlinkには、rel,type,title,hrefがあるのがわかります。
これらを、getValue()で取り出します。

post_link = item.getAttribute('href').getValue();

あとは取り出したデータを自由に加工して、スプレッドシートに書き込むなりなんなりと。

デバックや新規巡回先追加時用にURLから要素一覧とか構造を出力する関数つくっとくと便利かも。

https://developers.google.com/apps-script/reference/xml-service/element?hl=ja

Discussion