Mendeleyに対応してないウェブサイトから論文のメタデータを取り込んでみる(失敗)

Mendeleyに対応してないようなウェブサイト(に掲載された論文など)からどうやったら手軽にメタデータを取り込むことができるか、の失敗談。

いつものように具体的に想定しているのはカレントアウェアネス・ポータルで、特に、ちょくちょく引用されているのを見かけるもののCiNii Articlesには収録されてないカレントアウェアネス-E(CA-E)の記事をMendeleyに取り込むことができるようにしたいというのが発端です(=というかやりそびれた仕事……)。カレントアウェアネス(CA)のようにCiNii Articlesに収録されていれば、そこにはMendeleyへのエクスポート用リンクが設置されてますからね。



で、どうするか。アイディアは、カレントアウェアネス-EのページでCOinSを生成してMendeley Web Importerに渡すブックマークレットを書く、というものです。

COinS(ContextObjects in Spans)というのは、メタデータをOpenURL形式で記述してHTMLのタグに埋め込んでしまおうというものです。たとえばこんな感じになります。classの値である「Z3988」はOpenURLという標準規格にANSI/NISO Z39.88というIDが与えられていることによります。titleの値がメタデータ部分ですね。リンクリゾルバを見慣れてるかたは「ああ、いつものだ」と思うでしょう。

<span class="Z3988" title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fmendeley.com%2Fmendeley&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.date=2008&rft.volume=26&rft.issue=10&rft.pages=1135-1145&rft.atitle=Next-generation+DNA+sequencing.&rft.jtitle=Nature+Biotechnology&rft.title=Nature+Biotechnology&rft.aulast=Shendure&rft.aufirst=Jay&rft.au=Ji%2C+Hanlee&rft_id=info%3Apmid%2F18846087"></span>

MendeleyはCOinSに対応しており、この形式で埋め込まれているメタデータを認識することができます。特に、Mendeleyが提供しているメタデータインポート用ブックマークレット(Mendeley Web Importer)ではCOinSを活用できるようです。



そんなアイディアで書いてみたブックマークレットがこれです。

javascript: var d = document; var b = d.getElementsByTagName('body')[0]; var h1 = d.getElementsByTagName('h1')[0].innerHTML; h1.match(/(E\d+) - (\W+)/); var no = RegExp.$1; var title = RegExp.$2; var h4 = d.getElementsByTagName('h4')[1].innerHTML; h4.match(/No\.(\d+) (\d{4})\.(\d{2})\.(\d{2})/); var issue = RegExp.$1; var year = RegExp. $2; var s = d.createElement('span'); b.appendChild(s); s.setAttribute('class', 'Z3988'); s.setAttribute('title', 'ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fmendeley.com%2Fmendeley&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.date=' + year + '&amp;rft.issue=' + issue + '&amp;rft.atitle=' + encodeURI(title) + '&amp;rft.jtitle=Current+Awareness-E&amp;&amp;rft.aulast=&amp;rft.aufirst=&amp;rft.au=&amp;rft_id=info%3Apmid%2F18846087&amp;rft.issn=13477315'); b.appendChild(d.createElement('script')).setAttribute('src','https://www.mendeley.com/minified/bookmarklet.js');

見やすいように整形したのがこちら。

javascript:
var d = document;
var b = d.getElementsByTagName('body')[0];

var h1 = d.getElementsByTagName('h1')[0].innerHTML;
h1.match(/(E\d+) - (\W+)/);
var no = RegExp.$1;
var title = RegExp.$2;

var h4 = d.getElementsByTagName('h4')[1].innerHTML;
h4.match(/No\.(\d+) (\d{4})\.(\d{2})\.(\d{2})/);
var issue = RegExp.$1;
var year = RegExp. $2;

var s = d.createElement('span');
b.appendChild(s); s.setAttribute('class', 'Z3988');
s.setAttribute('title', 'ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fmendeley.com%2Fmendeley&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rft.genre=article&amp;rft.date=' + year + '&amp;rft.issue=' + issue + '&amp;rft.atitle=' + encodeURI(title) + '&amp;rft.jtitle=Current+Awareness-E&amp;&amp;rft.aulast=&amp;rft.aufirst=&amp;rft.au=&amp;rft_id=info%3Apmid%2F18846087&amp;rft.issn=13477315');

b.appendChild(d.createElement('script')).setAttribute('src','https://www.mendeley.com/minified/bookmarklet.js');

ここでやっているのは、

  1. カレントアウェアネス-Eのページからタイトル、年、号をスクレイピングする(著者名はとりあえず放置)
  2. COinSを生成してページ内に埋め込む
  3. Mendeley Web Importerのなかで使われているbookmarklet.jsを呼び出す

の3つ。

スクレイピングでは、記事タイトルが<h1>に入っていること、2つ目の<h4>に号数と発行日が入っていること(Ex. "No.238 2013.06.06")を使っています。

このブックマークレットをクリックすればうまくインポートされるはず……!

と思ったのですが、動作が通常のMendeley Web Importerと変わらない。ウェブページとして取り込もうとする。よくよく考えてみれば、bookmarklet.jsは、COinS入れて書き換えたあとのHTMLを見ているのではなく、URLを使って改めてページロードしてるんですね。だめじゃん。



となるとやっぱりシステムいじって 素直にCOinSを埋め込むしかないのかー。それ以外で、なんかうまい手あるでしょうか。ブックマークレットでやろうとするとMendeley APIを使うのはアウトだと思う(キーが必要なはずだし)。



あるいは、COinSを埋め込むようなラッパを書くという手もあるか。これは、@snowy0118さん作のChrome拡張であるCiNii Extensionが、CiNiiをTwitter Cardsに対応させるために使っているテクニックでもあります。つまり、ブックマークをクリックすると、http://menedeley.com/import/?url=http://somewhere/embedCoins?url=http://current.ndl.go.jp/e1435 というようなURLにlocationが移るようにしておく。このembedCoinsというラッパでは、http://current.ndl.go.jp/e1435 にCOinSを埋め込んだだけのページを生成する、と。







そんな感じの失敗談でした。