はじめに
openBD で書籍の情報を取得した際、海外文学だと author の値には下記のように翻訳者等の名前も入っています。
Cheng,François/著 辻由美/翻訳 ChengFrancois/著 チェンフランソワ/著
そこで純粋に著者名だけを取り出したい場合は、どうすればよいのか考えてみました。
openBD
今回取得するURLです。
取得結果
[
{
"onix": {
"RecordReference": "9784622076360",
"NotificationType": "03",
"ProductIdentifier": {
"ProductIDType": "15",
"IDValue": "9784622076360"
},
"DescriptiveDetail": {
"ProductComposition": "00",
"ProductForm": "BZ",
"Measure": [
{
"MeasureType": "01",
"Measurement": "20",
"MeasureUnitCode": "mm"
},
{
"MeasureType": "02",
"Measurement": "0",
"MeasureUnitCode": "mm"
}
],
"TitleDetail": {
"TitleType": "01",
"TitleElement": {
"TitleElementLevel": "01",
"TitleText": {
"collationkey": "ティエンイ ノ モノガタリ",
"content": "ティエンイの物語"
}
}
},
"Contributor": [
{
"SequenceNumber": "1",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "Cheng, François"
}
},
{
"SequenceNumber": "2",
"ContributorRole": [
"B06"
],
"PersonName": {
"content": "辻 由美"
}
},
{
"SequenceNumber": "3",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "Cheng Francois"
}
},
{
"SequenceNumber": "4",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "チェン フランソワ"
}
}
],
"Language": [
{
"LanguageRole": "01",
"LanguageCode": "jpn",
"CountryCode": "JP"
}
],
"Extent": [
{
"ExtentType": "11",
"ExtentValue": "443",
"ExtentUnit": "03"
}
]
},
"CollateralDetail": {
"TextContent": [
{
"TextType": "03",
"ContentAudience": "00",
"Text": "日中戦争から文化大革命まで、激動の中国を生き抜いた三人の男女の天職と運命を描いた感動的長編小説。詩人=書家が自らの人生を込めた、フェミナ賞受賞作。"
}
],
"SupportingResource": [
{
"ResourceContentType": "01",
"ContentAudience": "01",
"ResourceMode": "03",
"ResourceVersion": [
{
"ResourceForm": "02",
"ResourceVersionFeature": [
{
"ResourceVersionFeatureType": "01",
"FeatureValue": "D502"
},
{
"ResourceVersionFeatureType": "04",
"FeatureValue": "9784622076360.jpg"
}
],
"ResourceLink": "https://cover.openbd.jp/9784622076360.jpg"
}
]
}
]
},
"PublishingDetail": {
"Imprint": {
"ImprintIdentifier": [
{
"ImprintIDType": "19",
"IDValue": "622"
}
],
"ImprintName": "みすず書房"
},
"PublishingDate": [
{
"PublishingDateRole": "01",
"Date": ""
}
]
},
"ProductSupply": {
"SupplyDetail": {
"ReturnsConditions": {
"ReturnsCodeType": "04",
"ReturnsCode": "02"
},
"ProductAvailability": "99"
}
}
},
"hanmoto": {
"datecreated": "2015-08-20 04:43:13",
"reviews": [
{
"post_user": "genkina",
"reviewer": "湯川豊(京都造形芸術大学教授・文芸)",
"source_id": 29,
"kubun_id": 1,
"source": "毎日新聞",
"choyukan": "",
"han": "",
"link": "",
"appearance": "2011-10-23",
"gou": ""
},
{
"post_user": "genkina",
"reviewer": "栗田有起 (作家)",
"source_id": 8,
"kubun_id": 5,
"source": "週刊ブックレビュー",
"choyukan": "",
"han": "",
"link": "",
"appearance": "2011-12-03",
"gou": ""
}
],
"dateshuppan": "2011-09",
"datemodified": "2015-08-20 04:43:13"
},
"summary": {
"isbn": "9784622076360",
"title": "ティエンイの物語",
"volume": "",
"series": "",
"publisher": "みすず書房",
"pubdate": "2011-09",
"cover": "https://cover.openbd.jp/9784622076360.jpg",
"author": "Cheng,François/著 辻由美/翻訳 ChengFrancois/著 チェンフランソワ/著"
}
}
]
author
"author": "Cheng,François/著 辻由美/翻訳 ChengFrancois/著 チェンフランソワ/著"
上述のようにアルファベット表記や翻訳者名が入っています。
ここで欲しいのは一番最後の「チェンフランソワ」です。
そこで目を転じると、Contributor にそれぞれ独立した項目があります。
Contributor
"Contributor": [
{
"SequenceNumber": "1",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "Cheng, François"
}
},
{
"SequenceNumber": "2",
"ContributorRole": [
"B06"
],
"PersonName": {
"content": "辻 由美"
}
},
{
"SequenceNumber": "3",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "Cheng Francois"
}
},
{
"SequenceNumber": "4",
"ContributorRole": [
"A01"
],
"PersonName": {
"content": "チェン フランソワ"
}
}
],
アルファベット表記や翻訳者など複数の情報が入っています。
今回取り出したいのはアルファベットではなくカタカナのものなので、
「この4番目だけ取れば」と考えると、他の本のときに失敗してしまいます。
翻訳者が複数名だったり、数や順番はものによって変わります。
ContributorRole
さて、よく観察すると ContributorRole に「A01」や「B06」という値があります。
これは著者区分を示したものです。
JPO近刊情報センター公開の「【最新版】近刊情報センター「データ仕様第2版」20130726版」に、「ContributorRole」(近刊情報センター入力項目の「25.著者区分 ★」)として以下のような記述があります。
以下のコードのいずれかを設定する。
A01 : (By (author)) 【著・文・その他】
B01 : (Edited by) 【編集】
B20 : (Consultant editor) 【監修】
B06 : (Translated by) 【翻訳】
A12 : (Illustrated by) 【イラスト】
A38 : (Original author) 【原著】
A10 : (From an idea by) 【企画・原案】
A08 : (By (photographer)) 【写真】
A21 : (Commentaries by) 【解説】
E07 : (Read by) 【朗読】
「編著」(A01,B01)など、著者に「著者区分」が複数ある場合は、<ContributorRole>を繰り返してそれぞれの「著者区分」を設定する。
引用元:http://www.kinkan.info/manual/datashiyou-2nd
上記によると「A01」は著者、「B06」は翻訳者であることがわかります。
つまり Contributor の中から ContributorRole が「A01」かつ、
PersonName がアルファベットではないものを取得すればよい、ということになります。
実行
JS
const filteringContributors = (contributors) => {
const regex = /^[a-zA-Z\u00C0-\u017F]+(([',. -][a-zA-Z \u00C0-\u017F])?[a-zA-Z\u00C0-\u017F]*)*$/g; //アルファベットの人名に一致
const result = contributors.filter(val =>
val.PersonName.content.search(regex) === -1 && val.ContributorRole[0] === 'A01'
);
return result[0];
}
const isbn = '9784622076360';
const url = `https://api.openbd.jp/v1/get?isbn=${isbn}`;
fetch(url)
.then((res) => res.json())
.then(data => {
const contributors = data[0].onix.DescriptiveDetail.Contributor;
const contributor = filteringContributors(contributors);
const author = contributor.PersonName.content;
console.log(author); // 結果:チェン フランソワ
});
アルファベットの人名を除外するために正規表現を使いました。
const regex = /^[a-zA-Z\u00C0-\u017F]+(([',. -][a-zA-Z \u00C0-\u017F])?[a-zA-Z\u00C0-\u017F]*)*$/g; //アルファベットの人名に一致
通常のアルファベットなら [a-zA-Z] で良いのですが、
フランソワさんは「François」のようにアクセント記号があるため、
[a-zA-Z\u00C0-\u017F] としてアクセント記号にも対応しました。
アルファベットのみの文字列に有効なので「C・W・ニコル」さんとか、
日本語込みの文字列は大丈夫なはずです。
JS動作確認
See the Pen wOwvYX by folium77 (@folium77) on CodePen.
isbnの値を変更して色々試してみてください。
おわりに
ここでサンプルに使わせていただいた、「ティエンイの物語/フランソワ・チェン(みすず書房)」は、私が大変感動した作品です。今回は大変失礼なことに、著者名だけを取得してしまいましたが、辻由美さんの翻訳もとても素晴らしいです。気になった方は、ぜひ読んでみてください。