国立国会図書館が国会会議録の検索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 件のコメント:
コメントを投稿