国立国会図書館が国会会議録の検索APIを公開している。会議録の発言を発言や会議単位で検索できて、結果はXMLで取得できる。PythonでこのAPIを使って国会会議録の発言テキストを取得してみる。
Ubuntu 18.04(WSL)とPython3.6.5。
アクセスURLは2つで、発言単位と会議単位で発言を取得できる。1回のリクエストで取得できる発言には制限があって、発言単位では100、会議単位では5が最大数。ともにmaximumRecordsで取得する発言または会議を指定できる。今回は会議単位の取得で、検索条件は国家基本政策委員会合同審査会(党首討論)1議会分とする。
以下のようにデータをXMLで取得できる。取得できたのは最新の国家基本政策委員会合同審査会(党首討論)の、発言者ごとの発言。はじめに会議情報があって、そのあとに発言者ごとの発言テキストが続く。
XMLのままだと利用しにくいこともあるので、xml.etree.ElementTreeモジュールを使って解析する。APIが返す詳しいXMLの仕様は国会会議録の検索APIの返戻タグ一覧を参照。会議単位で取得した場合、会議ごとに発言がまとまっているので、会議名などに続いて発言者とその発言を取得する。ただし、会議録内の先頭の発言は会議録情報なのでスキップする。
コードを実行すると、以下のようにAPIで取得したXMLから発言テキストを取り出せる。
環境
Ubuntu 18.04(WSL)とPython3.6.5。
APIで会議録の取得
アクセスURLは2つで、発言単位と会議単位で発言を取得できる。1回のリクエストで取得できる発言には制限があって、発言単位では100、会議単位では5が最大数。ともにmaximumRecordsで取得する発言または会議を指定できる。今回は会議単位の取得で、検索条件は国家基本政策委員会合同審査会(党首討論)1議会分とする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | from urllib.request import Request, urlopen from urllib.parse import quote from urllib.error import URLError, HTTPError def create_query(): """ リクエストクエリの作成 """ # 国家基本政策委員会合同審査会(党首討論)1回分の発言を取得する params = { 'nameOfMeeting' : '国家基本政策委員会合同審査会' , 'maximumRecords' : 1 } return '&' .join([ '{}={}' . format (key, value) for key, value in params.items()]) def main(): # クエリはパーセントエンコードしておく req = Request(request_url) try : with urlopen(req) as res: res_xml = res.read().decode( 'utf8' ) except HTTPError as e: print ( 'HTTPError: {}' . format (e.reason)) except URLError as e: print ( 'URLError: {}' . format (e.reason)) else : print (res_xml) if __name__ = = '__main__' : main() |
以下のようにデータをXMLで取得できる。取得できたのは最新の国家基本政策委員会合同審査会(党首討論)の、発言者ごとの発言。はじめに会議情報があって、そのあとに発言者ごとの発言テキストが続く。
XMLから必要な情報を取得する
XMLのままだと利用しにくいこともあるので、xml.etree.ElementTreeモジュールを使って解析する。APIが返す詳しいXMLの仕様は国会会議録の検索APIの返戻タグ一覧を参照。会議単位で取得した場合、会議ごとに発言がまとまっているので、会議名などに続いて発言者とその発言を取得する。ただし、会議録内の先頭の発言は会議録情報なのでスキップする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | from urllib.request import Request, urlopen from urllib.parse import quote from urllib.error import URLError, HTTPError import xml.etree.ElementTree as ET def create_query(): """ リクエストクエリの作成 """ # 国家基本政策委員会合同審査会(党首討論)1回分の発言を取得する params = { 'nameOfMeeting' : '国家基本政策委員会合同審査会' , 'maximumRecords' : 1 } return '&' .join([ '{}={}' . format (key, value) for key, value in params.items()]) def parse_xml(res_xml): root = ET.fromstring(res_xml) try : for record in root.findall( './records/record/recordData/meetingRecord' ): # 会議録情報の取得 nameOfMeeting = record.find( 'nameOfMeeting' ).text issue = record.find( 'issue' ).text date = record.find( 'date' ).text print (nameOfMeeting, issue, date) for speechRecord in record.findall( 'speechRecord' ): # 発言者と発言の取得 speaker = speechRecord.find( 'speaker' ).text speech = speechRecord.find( 'speech' ).text if speaker is not None : # 先頭のspeechRecord(speaker=None)は出席者一覧などの会議録情報なのでスキップ print (speaker) print (speech) except ET.ParseError as e: print ( 'ParseError: {}' . format (e.code)) def main(): # クエリはパーセントエンコードしておく req = Request(request_url) try : with urlopen(req) as res: res_xml = res.read().decode( 'utf8' ) except HTTPError as e: print ( 'HTTPError: {}' . format (e.reason)) except URLError as e: print ( 'URLError: {}' . format (e.reason)) else : parse_xml(res_xml) if __name__ = = '__main__' : main() |
コードを実行すると、以下のようにAPIで取得したXMLから発言テキストを取り出せる。
0 件のコメント:
コメントを投稿