当初の質問
前提・実現したいこと
書籍名から出版社名を得て、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 #
回答2件
あなたの回答
tips
プレビュー