前提・実現したいこと
プログラミング初心者です。国会会議録検索システムのAPIを利用し、年ごとに特定のキーワードで検索結果を取得し、ファイルに書き込みたいと考えています。しかし、同APIには「一度に取得できる発言(speech)の上限は100件」という制限があります。
100件までの発言をファイルに書き込むことには成功したのですが、その上限を超えて取得するには「nextRecordPosition」というパラメータで次開始位置を利用する必要があるようです。この部分を付け加えたところ、エラーが出てしまいました。
発生している問題・エラーメッセージ
次のようなエラーが出ています。
UnsupportedOperation Traceback (most recent call last) <ipython-input-13-4bc2addc6e26> in <module>() 9 f = open('./thesis/sr'+ str(i) +'.txt', 'w', encoding="utf-8") 10 f.write(req.text) ---> 11 soup = BeautifulSoup(f, 'lxml') 12 if soup.find('nextRecordPosition') == True: 13 url = 'http://kokkai.ndl.go.jp/api/1.0/speech?nextRecordPosition%26101 ?maximumRecords\%3D100\%26any%3D自己責任%26from%3D' + str(i) +'-01-01%26 until%3D' + str(i) + '-12-31' ~\Anaconda3\lib\site-packages\bs4\__init__.py in __init__(self, markup, features, builder, parse_only, from_encoding, exclude_encodings, **kwargs) 243 244 if hasattr(markup, 'read'): # It's a file-type object. --> 245 markup = markup.read() 246 elif len(markup) <= 256 and ( 247 (isinstance(markup, bytes) and not b'<' in markup) UnsupportedOperation: not readable
該当のソースコード
(1)100件までの発言(speech)の検索結果を取得し、ファイルに書き込む
(2)100件までの発言を超えている(nextRecordPositionというタグがある)場合、該当ファイルに追記する
という2段構えでやろうとして失敗しています。
python3
1#「自己責任」というキーワードを含む発言を年ごとに取得し、 2#ファイルに保存するプログラム(対象期間は1945年から2019年) 3 4import requests 5from bs4 import BeautifulSoup 6 7#(1)100件までの発言(speech)の検索結果を取得し、ファイルに書き込む 8for i in range(1945, 2019+1): 9 url = 'http://kokkai.ndl.go.jp/api/1.0/speech?maximumRecords\%3D100\ 10 %26any%3D自己責任%26from%3D' + str(i) +'-01-01%26until%3D' + str(i) + '-12-31' 11 req = requests.get(url) 12 f = open('./thesis/sr'+ str(i) +'.txt', 'w', encoding="utf-8") 13 f.write(req.text) 14 soup = BeautifulSoup(f, 'lxml') 15 temp = soup.find('nextRecordPosition') 16#(2)100件までの発言を超えている(nextRecordPositionというタグがある)場合、該当ファイルに追記する 17 if temp == True: 18 url = 'http://kokkai.ndl.go.jp/api/1.0/speech?nextRecordPosition%26101\ 19 ?maximumRecords\%3D100\%26any%3D自己責任%26from%3D' + str(i) +'-01-01%26\ 20 until%3D' + str(i) + '-12-31' 21 req = requests.get(url) 22 f = open('./thesis/sr'+ str(i) +'.txt', 'a', encoding="utf-8") 23 f.write(req.text) 24 else: 25 break
試したこと
BeautifulSoupのところでエラーが出ているため、パーサをほかのもの(html.parser)に変えてみましたが、同様のエラーが出ました。
補足情報(FW/ツールのバージョンなど)
自分で気になっているのは、上記コードの次の部分です。
temp = soup.find('nextRecordPosition') if temp == True:
APIの仕様によると、発言件数が100件内に収まっている場合、「nextRecordPosition」というタグは表示されません。そこで「nextRecordPositionが見つかった場合、実行する」というif文を書きたいのですが、どう書くべきか迷ってこのようになりました。しかし、違うのでは、と……。
なお、国会会議録検索システムのAPIの仕様は以下にまとまっています。
http://kokkai.ndl.go.jp/api.html
自力ではここまでが精一杯でした。みなさまのお知恵を拝借できれば幸いです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/07 22:31 編集
2019/04/07 22:52 編集
2019/04/08 00:47
2019/04/09 01:14