RubyでPORTAから書誌データを取ってくる

 Ruby を使って、国立国会図書館PORTA から書誌データを取得してみます。今回は ISBN の指定による検索を行いたいので、Z39.50 インターフェースを利用します*1
 まず、Ruby のライブラリである zoomisbn-tools をインストールします。

$ sudo gem install zoom
$ sudo gem install isbn-tools

 次に以下の内容のスクリプトを作り、適当な名前で保存します(とりあえず porta.rb とします)。なお、このスクリプトは"How to Find Free MARC Records with Ruby"に掲載されているものを、ほぼそのまま使わせていただいています。

#!/usr/bin/ruby -w
 
# This script was originally written by William Denton 
# http://www.miskatonic.org/library/zmarc.html
 
require 'rubygems'
require 'zoom'
require 'isbn/tools'
 
if ARGV.length == 0
  puts "Please specify an ISBN"
  exit 0
end
 
isbn = ARGV[0]
isbn = isbn.gsub(/[^0-9X]/, '')

unless ISBN_Tools.is_valid?(isbn)
  puts "This is not a valid ISBN"
  exit 0
end
 
# NDL蔵書目録(zomoku)を対象にする
# その他のデータベース名はPORTAの仕様書を参照
server = ['api.porta.ndl.go.jp', 210, 'zomoku']
 
def z3950query (isbn, host, port, db)
  begin
    ZOOM::Connection.open(host, port) do |conn|
      conn.database_name = db
 
      # PORTAでのZ39.50のデータ返戻形式はSUTRSのみ
      # サーバによってはMARCXMLなどが指定できる
      conn.preferred_record_syntax = 'SUTRS'
 
      # USE(検索項目)アトリビュート(Type-1)の値に7(ISBN)を指定
      # 検索項目の対応表はPORTAの仕様書を参照
      rset = conn.search("@attr 1=7 #{isbn}")
      return rset[0]
    end
  rescue Exception => e
    # puts e # Uncomment to see any server errors
    return nil
  end
end
 
puts "#{server[0]} ..."
 
result = z3950query(isbn, server[0], server[1], server[2])
 
# PORTA上の書誌データのISBNが10桁の場合、10桁で入力しないと
# ヒットしない。13桁の場合も同様
# このため、検索結果が空だった場合、10桁で入力されたISBNを13桁に、
# 13桁で入力されたISBNを10桁に変換してもう一度検索する
if result.nil?
  if isbn.length == 10
    isbn = ISBN_Tools.isbn10_to_isbn13(isbn)
  elsif isbn.length == 13
    isbn = ISBN_Tools.isbn13_to_isbn10(isbn)
  end
  result = z3950query(isbn, server[0], server[1], server[2])
end    
 
unless result.nil?
  puts result
  exit 1
end
 
puts "Sorry, nothing found"
exit 0

 このスクリプトを ISBN を引数にして実行すると、以下のような出力が得られます。あとはこれを好きなように整形します。

$ ruby ./porta.rb 9784820403302
api.porta.ndl.go.jp ...
【title】:書誌レコードの機能要件 IFLA書誌レコード機能要件研究グループ最終報告(IFLA目録部会常任委員会承認) 和中幹雄,古川肇,永田治樹訳
【titleTranscription】:ショシ レコード ノ キノウ ヨウケン IFLA ショシ レコード キノウ ヨウケン ケンキュウ グループ サイシュウ ホウコク IFLA モクロク ブカイ ジョウニン イインカイ ショウニン
【alternative】:Functional requirements for bibliographic records:final report.
【creator】(dcndl:NDLNH):和中‖幹雄(1948−)
【creator】(dcndl:NDLNH):古川‖肇(図書館学)
【creator】(dcndl:NDLNH):永田‖治樹(1944−)
【creator】(dcndl:NDLNH):国際図書館連盟
【creatorTranscription】(dcndl:NDLNH):ワナカ,ミキオ(1948−)
【creatorTranscription】(dcndl:NDLNH):フルカワ,ハジメ(図書館学)
【creatorTranscription】(dcndl:NDLNH):ナガタ,ハルキ(1944−)
【creatorTranscription】(dcndl:NDLNH):コクサイ トショカン レンメイ
【subject】(dcndl:NDLNH):目録法
【subject】(dcndl:NDC):014.3
【subject】(dcndl:NDLC):UL631
【subjectTranscription】(dcndl:NDLNH):モクロクホウ
【description】:121p 30cm
【publisher】:日本図書館協会
【issued】:2004.3
【issued】(dcterms:W3CDTF):2004
【identifier】(dcterms:URI):http://api.porta.ndl.go.jp/ndlopac/cgi-bin/ndlopac/ndl-book?kywd=20565544
【identifier】(dcndl:ISBN):4-8204-0330-3
【identifier】(dcndl:JPNO):20565544
【identifier】(dcndl_porta:NDLCN):UL631−H9
【language】(dcterms:ISO639-2):JPN
【dpid】:zomoku
【repository_no】:R000000001
【item_no】:I000562723

*1:OpenSearchでもISBN指定での検索をできるようにしてほしいなあ。