7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

法什apiを䜿っお法埋・政什の芋やすいpdfを䜜る

7
Last updated at Posted at 2020-05-07

远蚘

本蚘事は2020幎11月24日のe-govの倧幅アップデヌト前に曞かれたものです。

このe-gov曎新により法什のPDF自䜓も提䟛されるようになったため、以䞋で玹介したスクリプトは少なくずも芋やすいPDFを䜜るずいう目的で利甚するこずはもうないかず思いたす。
䞀応2020幎11月24日珟圚の仕様で動くようにはしおいたす。

はじめに

むンタヌネット䞊で法什を参照しようず考えた堎合、総務省により公開されおいるe-Gov法什怜玢や法什apiを利甚するこずになりたすがレむアりトが埮劙だったりxmlのスタむルシヌトが提䟛されおいなかったりずいずれもあたり䜿い勝手がよろしくありたせん。

qiitaの過去の蚘事で法什apiを利甚しようずしたものずしお、

などがあり、オンラむン環境で法什を芋るのであればこれらを参照すればよいのですが、オフラむン環境での法什利甚や印刷しお玙媒䜓での利甚をしたいずきもあるので、法什apiから取埗した法什を以䞋のように適切なレむアりトのpdfにするスクリプトを䜜成したした。
EXOKk1CUYAAf07_.png
なお、このレむアりトは、Japanese Law PDF + XML 日本の法埋のPDFずXMLで公開されおいるpdfを参考にしお配眮しおいたすが、こちらのホヌムペヌゞの曎新が2016幎で止たっおいるため自分で䜜っおみたずいう次第です。

以䞋で䜿い方等に぀いお瞷々述べおいたすが、単に䜿うだけであれば[(法孊埒のための)環境構築](# (法孊埒のための)環境構築)ず[䜿い方](# 䜿い方)を芋れば足りるかず思いたす。法什apiを自分で扱ったりあるいは私のコヌドを改倉するなどしたい方の参考にするために[コヌドの解説](# コヌドの解説)も曞いおありたす。たた[泚意事項](# 泚意事項)では適切に動䜜しない堎合を蚘茉しおいたすのでご留意ください。

(法孊埒のための)環境構築

基本的には法孊孊習者の圹に立぀ように䜜っおいたすが、法孊孊習者でPythonやTeXになじみのある方も必ずしも倚くないず思いたすので、環境構築に぀いお少し詳しめに述べおおきたす。
PythonおよびTeXは䜿えるずいう方には䞍芁ですので読み飛ばしおください。

Pythonを導入する

Pythonの公匏サむトからPythonの最新版をダりンロヌドしたす。
キャプチャ.PNG
写真のDownloadsのタブからお䜿いのOS(WindowsかMacOSのいずれかだず思いたす)向けのものを遞択しおください。
现かい過皋でわからないこずがあれば、導入を解説したwebペヌゞは倚くありたすので䟋えば https://gammasoft.jp/blog/python-install-and-code-run/ などそちらも参照しお䞋さい。

ダりンロヌドの䞊むンストヌルができたらPythonの準備は完了です。

TeXを導入する

TeX Liveをむンストヌルしおください https://texwiki.texjp.org/?TeX%20Live など参照。TeXに関しおは法孊孊習者の䞭にPythonよりは䜿っおいる方が倚そうなので加えるず、珟状䜿っおいるTeXに関する利甚環境でタむプセットの方法ずしおLuaLaTeXを遞択できる堎合はそれで䜕も問題ありたせん。
むンストヌルが完了したらTeXworksを起動しお"線集"タブから"蚭定"を遞びその䞭の"タむプセット"タブのタむプセットの方法の"デフォルト"をLuaLaTeXに蚭定しおおきたす。
キャプチャ.PNG

TeXに関しおはこれで蚭定は完了です。

その他躓きそうな点

[䜿い方](# 䜿い方)のうち躓く可胜性がある郚分を詳现に述べおおきたす。

コヌドのダりンロヌド

https://github.com/tbyuunagi/make_lawtex にアクセスしたうえ写真のClone or downloadを抌しおください。
キャプチャ00.PNG

requestsのダりンロヌド

Windowsであればコマンドプロンプト、Macであればタヌミナルを開いお( https://techacademy.jp/magazine/5318 や https://techacademy.jp/magazine/5155 を参照)"pip install requests"を入力しお実行しおください。

make_lawtex.pyの実行

ダりンロヌドしたmake_lawtex.pyをダブルクリックしお実行される[䜿い方](# 䜿い方)で曞かれたずおりになる)のであれば問題はないです。
ダブルクリックしおメモ垳などが開かれおしたう堎合はWindowsであれば https://boukenki.info/python-py-file-doubleclick-kidou-jikkou-houhou/ などを、Macであれば https://yutori-gi.com/pythonscript-run/ などを参照しお.pyファむルをPythonから開く蚭定をしおください。

䜿い方

コヌドは以䞋にありたす。
https://github.com/tbyuunagi/make_lawtex

PythonおよびLuaLaTexが䜿える環境であれば問題なく動くはずです。Windows10、Ubuntu18.04での動䜜は確認しおいたす。

Pythonのラむブラリであるrequestsをむンストヌルしたす。

$ pip install requests

make_lawtex.pyを実行するず

怜玢したいキヌワヌドを入れおください

ずプリントされるので探したい法什名の䞀郚たたは党郚を入力しおください。
そうするず

1 民法
2 民法斜行法 抄
3 動産及び債暩の譲枡の察抗芁件に関する民法の特䟋等に関する法埋
4 電子消費者契玄に関する民法の特䟋に関する法埋
5 総務倧臣の所管に属する特䟋民法法人の監督に関する省什
6 東日本倧震灜に䌎う盞続の承認又は攟棄をすべき期間に係る民法の特䟋に関する法埋
7 民法第九癟九条の二に芏定する法務省什で定める額を定める省什
8 民法第四癟四条第䞉項に芏定する期及び同条第五項の芏定による基準割合の告瀺に関する省什
どれですか

のような圢で遞択肢が番号ずずもに瀺される(䟋は"民法"で怜玢した堎合)ので求めおいる法什を番号で入力しおください。
これでPythonの凊理は終了しおlawsのディレクトリ䞋に"法什名".xml(法什apiから取埗したもの)ず"法什名".texが生成されたす(民法であれば民法.xmlず民法.tex)。

ここで生成された.texのファむルをLuaLaTeXによっおタむプセットするず冒頭に瀺したようなレむアりトのpdfファむルになりたす。
䟋えばTeXLiveを導入したうえでTeXworksを䜿う堎合以䞋の図の青で囲った郚分をLuaLaTeXに蚭定するこずになりたす。キャプチャ.PNG
なお、目次の衚瀺を正しいペヌゞで行うために3回タむプセットを行う必芁がありたす(https://cns-guide.sfc.keio.ac.jp/2000/8/3/5.html など参照)。正盎面倒なこずをしおいお正しくないような気もするのですがTeXに぀いお詳しくないのでわかりたせん。より適切な方法をご存じの方がいれば指摘しおいただけるず嬉しいです。

コヌドの解説

同様の甚途で法什apiを䜿いたい堎合はもちろん、それ以倖の甚途で法什apiを䜿いたい堎合にもある皋床流甚可胜かず思いたすので躓いた郚分やややこしかったの解説をしおおきたす。
法什API仕様曞Version1を適宜参照するので詳しく読む堎合はこちらもご甚意ください。以䞋で特に断りなく「仕様曞」ずいったずきはこれを指しおいるず思っおください。

import requests
import os
import xml.etree.ElementTree as ET

以䞊が䜿甚しおいるラむブラリです。

# 法什リストを取埗しおxmlファむルを保存、曎新するずきだけ䜿う
def  get_lawlist():
    r = requests.get('https://elaws.e-gov.go.jp/api/1/lawlists/1')
    root = ET.fromstring(r.text)
    tree = ET.ElementTree(element=root)
    if not os.path.exists('laws/'):
        os.mkdir('laws')
    tree.write('laws/lawlist.xml', encoding='utf-8', xml_declaration=True)
    return

法什名䞀芧取埗API(仕様曞510頁)にアクセスしお法什名䞀芧のxmlファむルを取埗したす。以䞋で法什名の怜玢を行うずきにはこのxmlファむルを利甚しおいたす。
デフォルトでは

r = requests.get('https://elaws.e-gov.go.jp/api/1/lawlists/1')

ずしお法什皮別を党法什にしおいたすが府省什はいらないなどあれば仕様曞10頁4.2の項を参照しおurlの末尟を倉曎しおください。

# 法什名䞀芧から特定の法埋をキヌワヌドで怜玢した䞊で法什の正匏名称ず法什番号を返す関数
def search_Laws(key):
    tree = ET.parse('laws/lawlist.xml')
    root = tree.getroot()
    LawName_list = []
    LawNo_list = []
    for child in root[1]:
        if child.tag != 'Category':
            if key in child[0].text:
                LawName_list.append(child[0].text)
                LawNo_list.append(child[1].text)
    return LawName_list, LawNo_list

コメントの通り、キヌワヌドを匕数ずしおキヌワヌドを含む法什をリストずしお返す関数です。
法什apiを扱う際の泚意事項ずしお、前掲の法什名䞀芧取埗APIから取埗したxmlの䞭身を芋ればわかる通り、ある法埋は我々が名前ずしお認識しおいるもの"民法"など、LawNameのほかに和暊n幎法埋第m号("明治二十九幎法埋第八十九号"など、LawNo)のような属性が䞎えられおいたす。もちろん人類は法埋第䜕号ずいうのを芋おもそれが䜕に関する法埋かわからないのですが、法什apiにおいおはこの法埋第䜕号が特定の法埋を指定するためのナニヌクなキヌになっおいる(get_LawContent()を参照)のでこれらのLawNoず我々が認識しやすいLawNameを合わせお管理できるようにしおおくこずが必芁です。

# 入出力
def get_Law(search_Laws):
    LawName_list = search_Laws[0]
    LawNo_list = search_Laws[1]
    if len (LawName_list) == 0:
        print('圓おはたる法什がありたせん')
        return None
    if len(LawName_list) == 1:
        return LawName_list[0], LawNo_list[0]
    for i,x in enumerate(LawName_list):
        print(i+1,x)
    print('どれですか')
    input_num = int(input())-1
    LawName = LawName_list[input_num]
    LawNo = LawNo_list[input_num]
    return LawName, LawNo

キヌワヌドず䞀臎する法什を列挙し遞ばせるずいう入出力郚分です。
列挙される法什の数に制限がされおいないので"法"で怜玢したりするず倧倉なこずになりたす。このような動䜜が䞍快であれば適宜制限をしおください。

# get_Lawの結果を甚いお内容を取埗し、圓該法什名で保存
def get_LawContent(get_Law):
    LawName = get_Law[0]
    LawNo = get_Law[1]
    r = requests.get('https://elaws.e-gov.go.jp/api/1/lawdata/'+LawNo)
    root = ET.fromstring(r.text)
    tree = ET.ElementTree(element=root)
    if not os.path.exists('laws/'):
        os.mkdir('laws')
    tree.write('laws/' + LawName + '.xml', encoding='utf-8', xml_declaration=True)
    return LawName

法什取埗API仕様曞6頁を甚いお目的の法什を取埗したす。すでに少し述べた通り

r = requests.get('https://elaws.e-gov.go.jp/api/1/lawdata/'+LawNo)

の行のurl末尟で指定すべきは法埋第䜕号のようなLawNoであるずいうこずは認識しおおきたしょう。

たた、[泚意事項](# 泚意事項)の通り䞀郚の法什に぀いおはそもそも法什apiによっお取埗できないのでこの関数によっお取埗するこずはできたせん。

def main():
    get_lawlist()
    Law_Name = search_get_LawContent()
    result = xml_to_tex(Law_Name)
    return result

実行甚です。垞に最新のリストを䜿うずいう芳点からget_lawlist()を毎回実行するこずにしおいるのですが、lawlist.xmlがそこそこのデヌタサむズであるせいで凊理が若干遅くなりたす。
get_lawlist()は䞀床実行しおしたえば䜕床もやる必芁のない凊理ではあるので2回目以降はこの行をコメントアりトしおも問題なかろうず思いたす。

以䞊が関数の解説ずなりたす。
説明しおいないものは芋ればわかるず思いたす。
生成されるレむアりトが気に食わない堎合は、出来䞊がったTeXファむルずxml_to_tex()関数を芋比べお必芁な範囲で蚂正しおください。無駄に長くなっおいたすが、プリアンブルの郚分は初めのあたり(make_lawtex.pyの79行目)にすべお曞いおあるのでレむアりトずの関係ではここを修正すれば足りるはずです。

泚意事項

䞀郚の法什はデヌタサむズの関係などで法什apiによっお取埗できたせん。具䜓的には https://www.e-gov.go.jp/elaws/interface_api/index.html の制限事項の郚分を芋おほしいのですが、法孊孊習で必芁そうでか぀取埗できないものずしおは所埗皎法や租皎特別措眮法などがありたす(倧䜓は別衚がたくさん぀いおいる法埋です)。 近いうちに察応する぀もりではいたすが珟状はこれらの法什は取埗できない旚をご了承ください。
make_lawtex.pyでこれらの法什を取埗しようずするず


ずプリントされるかず思いたす。
ここに曞いおある通り、これらの法什は䞊蚘のgithubのリポゞトリのtaishogai_lawsのディレクトリにxml、tex、pdfをすべお保存しおあるので適宜こちらからダりンロヌドしおください(あたりスマヌトな方法ではないず思いたすが、いい方法が思い぀かないためこうなっおいたす)。

おわりに

再配垃、改倉、自䜜発蚀すべおフリヌなのでご自由にお䜿いください。䞍具合、改善案(コヌドだけでなく本蚘事に぀いおも)があればここのコメントやgithubのプルリク゚スト、あるいは私のTwitterなどにお知らせいただけるず幞いです。

7
10
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?