国立国会図書館が国会会議録の検索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議会分とする。
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(): # クエリはパーセントエンコードしておく request_url = 'http://kokkai.ndl.go.jp/api/1.0/meeting?' + quote(create_query()) 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の返戻タグ一覧を参照。会議単位で取得した場合、会議ごとに発言がまとまっているので、会議名などに続いて発言者とその発言を取得する。ただし、会議録内の先頭の発言は会議録情報なのでスキップする。
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(): # クエリはパーセントエンコードしておく request_url = 'http://kokkai.ndl.go.jp/api/1.0/meeting?' + quote(create_query()) 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 件のコメント:
コメントを投稿