国立国会図書館サーチで書籍情報を取得するカスタムアプリ制作、今回からは著者名の取得における問題を潰していきます。まず今回は複数の著者名が収録されている場合の読み込みについてです。若干長くなってしまいましたが、ほとんどがタグを目印にしたテキストのピックアップについてゴニョゴニョやってるだけで、あまり真新しいことはないかと思います。ですので今回は最後の有料部分でにデータをダウンロードできるようにしておきます。
まずは確認されている事象
前回ではタイトルに関して、日本語以外で収録されているなど、読みが収録されていない場合がある、という話をしました。同じようなことは著者名でも起こり得ます。ひとつ例を紹介します。
小さなチーム、大きな仕事 37シグナルズ成功の法則
こちらは著者が2名、訳者が4名収録されています。ISBNは「9784153200111」です。入力して結果を見てみます。
著者フィールドにはカンマで区切られた著者名が格納され、訳者は読み込めていません。その一方で、読みの部分には訳者名うちの1名が格納されています。この不整合を解消するのが今回の目標です。
改めて仕様を確認
とにかく、仕様書で収録の規則を確認してみます。https://ndlsearch.ndl.go.jp/renkei/dcndl#creator
タイトルと同様に、<dcterms:creator>タグ内のテキストと、<dc:creator>タグ内のタイトルと読みのセットの2通りに格納されていますが、訳書や共著については特に書かれていません。ただし、入力レベルは「あれば必須」ということで、作者名については存在しない場合も想定されているようです。なのでごく稀に、項目が収録されてないためにうまく取り込めないケースが起こるかもしれません。
前回記事の最後にリンクしたアプリのデータをスタート地点に、例を見てみます。
実際にどう収録されているか
著者と訳者がそれぞれ複数いる場合
先に例示した、「小さなチーム・大きな仕事」の場合を例に、NDLサーチの結果でどう収録されているのかを見てみます。リクエストURLは次のとおりです。
https:
著者名に関する部分を抜粋します。
<dcterms:creator>タグではそれぞれの著者、訳者ごとに読みとセットで収録されていて、英文で収録されている場合は読みが収録されていません。<dc:creator>タグでは複数の著者と複数の訳者をそれぞれタグの中でカンマで区切って収録しています。
制作しているカスタムアプリの場合、著者名を<dc:creator>、よみを<dcterms:creator>の後に現れる<dcndl:transcription>タグで読み込んでいます。同じタグが繰り返されている場合は最初のタグで区切られている範囲を取得してしまうため、著者名フィールドでは訳者名が取得されず、よみでは訳者名を取得してしまう、ということが起きています。
細目に著者が収録されている場合
もう一例、編者と複数の著者が収録されている例を挙げます。
日本の反知性主義
ISBNは9784794968180です。リクエストURLは次のとおりです。
https:
著者に関する部分は次のようになっています。
この後に出版社、発行年月が収録されていて、さらにその後に内容細目<dcndl:partinformation>が収録されています。そこに各章の著者が収録されています。
このような形で収録されている場合は、全ての著者名を格納するのはあまり現実的ではありません。実際、WEB版の国会図書館サーチにアクセスしてみると、個別ページで著者として収録されているのは編者です。
なにを格納するか
だいぶ前置きが長くなりました。2つ目は例外として、ここでは、<dc:creator>タグで収録されている著者、訳者などを、収録されている通りに格納するのを目標にします。なお、著者名の読みについては個人利用を想定しているカスタムアプリには必要ないものとします。
これまでに作成したスクリプトでは、単純に最初に現れる<dc:creator>タグに囲われた部分を取得していました。著者名と訳者名の間で区切られてしまっているので、区切られた以降の訳者名が取得できなくなっています。
著者名と訳者名を取得する
著者と訳者が続けて収録されている、「小さなチーム・大きな仕事」の場合、次のように収録されています。
この部分を含むテキストが「XML」フィールドに格納されているものとします。
中間部分のタグを削除する
このテキストから、著者と訳者の間に入ってるタグ</dc:creator><dc:creator>をカンマで置き換えてできるテキストを[creator]とします。スクリプト内で使う場合は変数にしますが、フィールドに格納しても結果は同じです。
Substitute関数で置き換えますが、置き換える対象テキストを</dc:creator><dc:creator>と一連の文字列にすることで、繰り返して収録されている部分のタグのみを置き換えることができます。タグが無い場合は該当する検索テキスト"</dc:creator><dc:creator>"が存在しないのでそのままです。
結果は次のようになります。
これで、<dc:creator>タグが複数並べられていても、一つにまとめられました。
タグの中身を取得する
ここまで来れば、あとはMiddle関数で取り出すのみです。実際のXMLフィールドにはタイトルや他の要素も収録されているので、取り出す最初の位置はPosition関数で指定します。
そして取り出す文字数は最初に現れる終了タグ"</dc:creator>"の位置から、開始タグの位置を引いた数から、タグの長さ(18文字)を引いた数になります。後に細目が収録されている場合はこの段階で取り除かれます。これで要素が出揃いました。
スクリプトステップで実装する