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&rfr_id=info%3Asid%2Fmendeley.com%2Fmendeley&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.date=' + year + '&rft.issue=' + issue + '&rft.atitle=' + encodeURI(title) + '&rft.jtitle=Current+Awareness-E&&rft.aulast=&rft.aufirst=&rft.au=&rft_id=info%3Apmid%2F18846087&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&rfr_id=info%3Asid%2Fmendeley.com%2Fmendeley&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=article&rft.date=' + year + '&rft.issue=' + issue + '&rft.atitle=' + encodeURI(title) + '&rft.jtitle=Current+Awareness-E&&rft.aulast=&rft.aufirst=&rft.au=&rft_id=info%3Apmid%2F18846087&rft.issn=13477315'); b.appendChild(d.createElement('script')).setAttribute('src','https://www.mendeley.com/minified/bookmarklet.js');
ここでやっているのは、
- カレントアウェアネス-Eのページからタイトル、年、号をスクレイピングする(著者名はとりあえず放置)
- COinSを生成してページ内に埋め込む
- 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を埋め込んだだけのページを生成する、と。
そんな感じの失敗談でした。