SpringerLinkでISBNから書誌情報を得る

~/ebooks というディレクトリに bok%3A…….pdf というファイルがいくつか入っている。この …… の部分がISBNである。まずそれを抽出する:

names = dir("~/ebooks", "^bok.*\\.pdf$")
isbns = sub("^bok%3A(.*)\\.pdf", "\\1", names)

次に,ISBNを一つ与えて,SpringerLinkから書名と著者名を取ってくる関数を書く:

library(xml2)

foo = function(isbn) {
    url = paste0("http://link.springer.com/book/10.1007/", isbn)
    x = read_html(url)
    title = xml_text(xml_find_all(x, "//h1[@id='title']"))
    authors = unique(xml_text(xml_find_all(x, "//*[@itemprop='author']/*[@itemprop='name']")))
    paste(isbn, title, paste(authors, collapse=", "), sep="\t")
}

ただし,いくつかのISBNで「HTTP error 404」が生じる。つまり,ファイル名のISBNとURLのISBNがうまく対応していない場合があるようである。とりあえず以下では try() を使ってエラーで止まらないようにした。

上の関数を各ISBNに対して実行する。ただし1回ごとに1秒休憩を入れる:

for (i in isbns) {
    try(cat(foo(i), "\n", sep=""))
    Sys.sleep(1)
}

エラーを起こした場合は個別に対応する(ここは改良の余地がある)。


[追記] 上を書いた後で教えていただいたが,CrossRef REST API を使うという手もあった。http://api.crossref.org/works/10.1007/978-3-540-38819-7 のようなURLにアクセスすればJSONで書誌情報が取得できる。ただ,ファイル名から抽出したISBNではエラーが起きることがあるということでは同じようだ。

[追記] 検索結果をCSVでダウンロードするという方法も教えていただいた

[追記] さらにいえば,PDFファイルの中にメタデータとして著者名・書名などを埋め込んでくれたほうがありがたい。O'Reillyのある本をMacの mdls コマンドで調べた結果は次の通り:

$ mdls Anonymizing_Health_Data.pdf
……
kMDItemAuthors                 = (
    "Khaled El Emam and Luk Arbuckle"
)
……
kMDItemTitle                   = "Anonymizing Health Data"
……