2018年11月28日水曜日

Pythonで国会会議録のテキストを取得する

国立国会図書館が国会会議録の検索APIを公開している。会議録の発言を発言や会議単位で検索できて、結果はXMLで取得できる。PythonでこのAPIを使って国会会議録の発言テキストを取得してみる。



環境


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 件のコメント:

コメントを投稿