~/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"
……