質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2165閲覧

国会図書館検索APIで書籍名から出版社名を得たいがヒットしない

XTJP

総合スコア11

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2020/11/15 08:15

編集2020/11/16 02:22

当初の質問

前提・実現したいこと

書籍名から出版社名を得て、Googleスプレッドシートにまとめたいです。Colabで作業していますが、一旦csvにダウンロードして手動でスプレッドシートに貼り付けるのでも構いません。

PythonでもGASでも良くて、楽天ブックスのAPIなどを使って実現できるならそれでよいです。

発生している問題・エラーメッセージ

書籍が検索でヒットしない
なお、書籍名は

  • Dr.竜馬の病態で考える人工呼吸管理
  • こういうことだったのか!!酸素療
  • エース薬理学
  • そこが知りたかった 中毒診療

などです。これらを「夏目漱石」とか「人工知能」とかに変更するとヒットしました。

該当のソースコード

(文字数制限の都合上削除しました)

試したこと

http://ailaby.com/ndl_search/
ほとんどこちらのサイトのコードそのままです。

楽天ブックスのAPIもためしましたが、ISBNを使用する場合の方法だけがネット検索で見つかったので難儀しています。

2020/11/16追記

教えていただいた内容を反映してシートに転記するコードを書いたのですがまだうまく動きません。アドバイスを頂けると幸いです。

変更点

  • cellの内容のみを取得
  • sheetに反映 のコードを自作
  • このコードの作者さんは1つの本に対して複数のデータを収集し、dfにまとめるものでしたが、私の場合は複数の本に対してそれぞれ1つのデータ(出版社名+あわよくば著者名など)を収集し、sheetにまとめたいので自分なりに編集しました。

発生している問題・エラーメッセージ

Python

1--------------------------------------------- 2Search results for cnt=1 mediatype=1 title=そこが知りたかった 中毒診療 from=19800101 3--------------------------------------------- 4--------------------------------------------------------------------------- 5NameError Traceback (most recent call last) 6<ipython-input-7-ed4b9090a8a1> in <module>() 7 109 8 110 #sheetに反映 9--> 111 worksheet.update_cell(cell.row, cell.col +1, publisher.text) 10 112 worksheet.update_cell(cell.row, cell.col +2, item.find('title').text) 11 113 worksheet.update_cell(cell.row, cell.col +3, author.text) 12 13NameError: name 'publisher' is not defined

該当のソースコード

Python

1import numpy as np 2from pandas import DataFrame 3import xml.etree.ElementTree as ET 4import requests 5from collections import defaultdict 6from google.colab import files 7 8ss_url = "https://docs.google.com/spreadsheets/d/oooooo" 9workbook = gc.open_by_url(ss_url) 10worksheet = workbook.get_worksheet(1) 11 12cell_list = worksheet.range("A4:A10") 13for cell in cell_list: 14 15 # 検索条件 16 params = {} 17 params['title'] = cell.value 18 params['mediatype'] = '1' 19 params['from'] = '1980-01-01' 20 params['cnt'] = '1' 21 params['idx'] = '1' 22 23 list_map = defaultdict(list) 24 total = 0 25 26 # セッション 27 s = requests.session() 28 29 while True: 30 31 # 検索リクエスト 32 r = s.get('http://iss.ndl.go.jp/api/opensearch', params=params) 33 34 # XML パース 35 root = ET.fromstring(r.text.encode('utf-8')) 36 print ('---------------------------------------------') 37 print (root.find('channel').find('description').text) 38 print ('---------------------------------------------') 39 40 items = root.findall('.//item') 41 for i, item in enumerate(items): 42 print ('--------' + str(total+i+1) + '---------') 43 44 # タイトル 45 print (item.find('title').text) 46 list_map['title'].append(item.find('title').text) 47 48 # ID 49 # linkタグのテキストから抜き出す 50 # 例 51 # <link>http://iss.ndl.go.jp/books/R100000001-I022140205-00</link> 52 # ↓ 53 # R100000001-I022140205-00 54 # 55 link = item.find('link').text 56 print (' ' + link[link.rfind('/')+1:]) 57 list_map['ID'].append(link[link.rfind('/')+1:]) 58 59 # 著者 60 # 書式さまざま 61 #    例 62 # ・ 夏目 漱石, 63 # ・ 夏目漱石 作, 64 # ・ 夏目, 漱石, 1867-1916, 65 # ・ 夏目漱石/著, 66 # 67 author = item.find('author') 68 if author is not None: 69 print (' ' + author.text) 70 list_map['author'].append(author.text) 71 else: 72 list_map['author'].append('') 73 74 # 出版日 75 # 例 Fri, 23 Jun 1995 09:00:00 +0900 76 pubDate = item.find('pubDate') 77 if pubDate is not None: 78 print (' ' + pubDate.text) 79 list_map['pubDate'].append(pubDate.text) 80 else: 81 list_map['pubDate'].append('') 82 83 # 発行年 84 # 複数セットされるケースがあるので、もっとも古い年を取得する 85 issueds = item.findall('{http://purl.org/dc/terms/}issued') 86 lst = [issued.text for issued in issueds] 87 if len(lst) > 0: 88 print (' ' + lst[np.argmin(lst)]) 89 list_map['issued'].append(lst[np.argmin(lst)]) 90 else: 91 list_map['issued'].append('') 92 93 # シリーズタイトル 94 # 文庫本の場合、ここに ○○文庫 とのっている 95 seriesTitle = item.find('{http://ndl.go.jp/dcndl/terms/}seriesTitle') 96 if seriesTitle is not None: 97 print (' ' + seriesTitle.text) 98 list_map['seriesTitle'].append(seriesTitle.text) 99 else: 100 list_map['seriesTitle'].append('') 101 102 # 出版社 103 publisher = item.find('{http://purl.org/dc/elements/1.1/}publisher') 104 if publisher is not None: 105 print (' ' + publisher.text) 106 list_map['publisher'].append(publisher.text) 107 else: 108 list_map['publisher'].append('不明') 109 110 #sheetに反映 111 worksheet.update_cell(cell.row, cell.col +1, publisher.text) 112 worksheet.update_cell(cell.row, cell.col +2, item.find('title').text) 113 worksheet.update_cell(cell.row, cell.col +3, author.text) 114 115 116 cnt = int(params['cnt']) 117 idx = int(params['idx']) 118 if len(items) < cnt: 119 break 120 121 122 # df = DataFrame({'title' : list_map['title'], 123 # 'ID' : list_map['ID'], 124 # 'author' : list_map['author'], 125 # 'pubDate' : list_map['pubDate'], 126 # 'issued' : list_map['issued'], 127 # 'seriesTitle' : list_map['seriesTitle'], 128 # 'publisher' : list_map['publisher']}, 129 # columns = ['title', 'ID', 'author', 'pubDate', 'issued', 'seriesTitle', 'publisher']) 130 # df.to_csv("books.csv", encoding='utf-8') 131 # files.download('books.csv') 132 133 # df 134 135 #

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/11/15 08:23

r = s.get('http://iss.ndl.go.jp/api/opensearch', params=str(params['title'])) でやろうとしている検索リクエストと等価なリクエストをブラウザのアドレスバーに打ち込んでみて、結果を確認してみましたか?
XTJP

2020/11/16 01:22 編集

toast-uz様 おそらく、以下の内容をブラウザのアドレスバーに打ち込むことになると思うのですが、これをどのように表記すればよいのかご教示いただけると助かります。不勉強で申し訳ありません。 http://iss.ndl.go.jp/api/opensearch {'title': 'そこが知りたかった 中毒診療', 'mediatype': '1', 'from': '1980-01-01', 'cnt': '2', 'idx': '1'}
guest

回答2

0

Google Apps Script の情報を求めてこられた方へ。

https://teratail.com/questions/210493 こちらに isbn 検索の例があります。

↑をもとに isbn= のかわりに title=${encodeURIComponent('人工知能')} とやればタイトルで検索できます。
isbn と違って、title の場合、複数見つかるので item[0] の 0 を固定ではなくループすればいけるかと。

投稿2020/11/20 16:49

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

getで渡しているparamsを文字列に変換しているようですが、ここは辞書そのもので渡すのではないでしょうか。
これでは、getのurlにパラメータが設定されないと思います。

python

1 # 検索リクエスト 2 r = s.get('http://iss.ndl.go.jp/api/opensearch', params=str(params['title']))

修正
paramsにそのままparamsを代入する。

python

1 # 検索リクエスト 2 r = s.get('http://iss.ndl.go.jp/api/opensearch', params=params)

cell_list = worksheet.range("A4:A5")だと、cell情報も入っているため、これを参照するときは
valueで値を参照してください。

python

1params['title'] = cell.value

参照している変数publisherがforループの外です。
publisherの処理が、forループの内側のときははインデントをforと合わせる必要があります。

python

1 else: 2 list_map['publisher'].append('不明') 3 #インデントがあっていないので、forのインデントに合わせてください 4 #sheetに反映 5 worksheet.update_cell(cell.row, cell.col +1, publisher.text) 6 worksheet.update_cell(cell.row, cell.col +2, item.find('title').text) 7 worksheet.update_cell(cell.row, cell.col +3, author.text)

検索APIを確認してみました。
https://iss.ndl.go.jp/information/wp-content/uploads/2020/03/ndlsearch_api_20200302_jp.pdf
年月日の指定で、月を指定すると、年だけのものにはヒットしないようです。
パラメタの'from'をコメントアウトして見て下さい。

python

1# params['from'] = '1980-01-01'

あと、以下のコードの意味はなんでしょうか。
検索が成功したとき、len(items)がcntに等しくなってしまうため。
無限ループになってしまいます。
確認して下さい。

python

1 cnt = int(params['cnt']) 2 idx = int(params['idx']) 3 if len(items) < cnt: 4 break

投稿2020/11/15 12:30

編集2020/11/16 14:21
akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

XTJP

2020/11/16 00:35

早速のご回答ありがとうございます。ご教示の通り、該当箇所を修正しました。 以下の結果が得られ、検索には引っかかっていないように思います。また、シートのA4のセルを「人工知能」にしてみても結果は同様でヒットしませんでした。何か他に考えられる原因はありますでしょうか。不勉強で申し訳ありません。 ``` --------------------------------------------- Search results for mediatype=1 from=19800101 cnt=2 title=<Cell R4C1 '人工知能'> --------------------------------------------- --------------------------------------------- Search results for title=<Cell R5C1 '救急白熱セミナー\u3000頭部外傷実践マニュアル改訂2'> from=19800101 mediatype=1 cnt=2 ```
akiruno-oneone

2020/11/16 01:00

上記のタイトルに、セル情報が入っています。これで検索に失敗しているのでは。 タイトルのみにしてください。 <Cell R4C1 '人工知能'> ⇒人工知能 こちらでは、直接「人工知能」を入力したところ、検索結果がでました。 (googleシートが使えないため) cell_list = worksheet.range("A4:A5") ⇒cell_list = ['人工知能']
akiruno-oneone

2020/11/16 01:14

cell_listの値を参照するときは、valueがいるみたいですね。 回答に追記しました。
XTJP

2020/11/16 01:20

盲点でした。gspreadの使い方を把握していませんでした。 ご指摘の通り、 params['title'] = cell ↓ params['title'] = cell.value にして、A4を"人工知能"にしたところ、無事結果が取得できました。 一方、A4を"そこが知りたかった 中毒診療"に戻すと、やはりヒットしませんでした。手入力で国会図書館のサイトで検索するとヒットするのですが… なにか検索方法が誤っているのでしょうか… https://iss.ndl.go.jp/books?op_id=1&any=%E3%81%9D%E3%81%93%E3%81%8C%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F+%E4%B8%AD%E6%AF%92%E8%A8%BA%E7%99%82&display=
akiruno-oneone

2020/11/16 01:43

空白が原因でしょうか。 上記の検索"そこが知りたかった 中毒診療"の空白は全角ですね。 一方、検索でヒットするタイトルの空白は半角です。 失敗:"そこが知りたかった 中毒診療"  ★全角の空白 成功:"そこが知りたかった 中毒診療"  ★半角の空白
XTJP

2020/11/16 02:12

空白や記号も統一する必要がありそうですね。ありがとうございます。 教えていただいた内容を反映して、シートに転記するコードを書いたのですがまだうまく動かないので、助言をいただけると助かります。質問文本文に追記しました。
XTJP

2020/11/16 10:08

ご回答ありがとうございます。インデントを修正し、エラーはでなくなりましたが、 if publisher is not None: print (' ' + publisher.text) でも出版社は表示されず、スプレッドシートにも反映されません。やはり実現するのは難しいでしょうか…
akiruno-oneone

2020/11/16 14:26

検索条件の"from"を削除し確認しました。 掲題の書式名で検索しましたが、検索はできているようです。 (但し、スプレッドシートは使っていません。)
XTJP

2020/11/16 23:58

APIのドキュメントまで調べていただいてありがとうございます。fromの条件に制限があったことを知りませんでした。うまく動きそうなので、これでしばらくコードをブラッシュアップしていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問