/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

GoogleAppsScriptではてブのRSSをパースする

今日も今日とてGASネタです。

f:id:yatta47:20181027224336j:plain

前回の記事ではAtom形式のRSSをパースしたけれど、今回ははてなブックマークRSSをGoogleAppsScriptでパースします。

 

はてなブックマークRSSは、ちょっと特殊で独自のNamespaceが入ってたりします。

f:id:yatta47:20190618205907p:plain

このへん。Namespaceが入っているところがちょっと違います。

まずはコードを。

 

コード

function getHatenaRss(){
  var feedURL = "http://b.hatena.ne.jp/hotentry/it.rss";
  
  var xml = UrlFetchApp.fetch(feedURL).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var rss = XmlService.getNamespace('http://purl.org/rss/1.0/');
  var dc = XmlService.getNamespace('dc', 'http://purl.org/dc/elements/1.1/');
  var hatena = XmlService.getNamespace('hatena', 'http://www.hatena.ne.jp/info/xmlns#');
  
  var items = root.getChildren('item', rss);
  
  var results = [];
  
  for (var i = 0; i < items.length; i++) {
    var item = {}
    
    item.title = items[i].getChild('title', rss).getText();
    item.link = items[i].getChild('link', rss).getText();
    item.date = items[i].getChild('date', dc).getText();
    var bookmarkcount_string = items[i].getChild('bookmarkcount', hatena).getText();
    item.bookmarkcount = parseInt(bookmarkcount_string, 10);
    
    results.push(item);
    Logger.log(item);
  }
  
  return results;
}

ブックマーク数は後で使いたいので、数値にしています。

 

はまったところ

Namespaceが入っているとちゃんとその要素だよというのを指定してあげないと取得できないので、そこをどのように書けばいいのか迷いました。

Namespaceは、だいたい一番上のタグ内に定義されています。

f:id:yatta47:20190618210147p:plain

その情報をもとにして定義、指定してあげれば取得できました。

 

まとめ

前に同じようにNamespaceが指定してあるものがRubyで取ろうとしたときに取れなくて、その時はすべて定義を消しちゃってとったけど今となってはその辺ももっとスムーズにできるかもしれない。

それではまたー。