远èš
æ¬èšäºã¯2020幎11æ24æ¥ã®e-govã®å€§å¹ ã¢ããããŒãåã«æžããããã®ã§ãã
ãã®e-govæŽæ°ã«ããæ³ä»€ã®PDFèªäœãæäŸãããããã«ãªã£ãããã以äžã§ç޹ä»ããã¹ã¯ãªããã¯å°ãªããšãèŠãããPDFãäœããšããç®çã§å©çšããããšã¯ãããªãããšæããŸãã
ïŒäžå¿2020幎11æ24æ¥çŸåšã®ä»æ§ã§åãããã«ã¯ããŠããŸããïŒ
ã¯ããã«
ã€ã³ã¿ãŒãããäžã§æ³ä»€ãåç §ããããšèããå Žåãç·åçã«ããå ¬éãããŠããe-Govæ³ä»€æ€çŽ¢ãæ³ä»€apiãå©çšããããšã«ãªããŸããã¬ã€ã¢ãŠãã埮åŠã ã£ããxmlã®ã¹ã¿ã€ã«ã·ãŒããæäŸãããŠããªãã£ãããšããããããŸã䜿ãåæããããããããŸããã
qiitaã®éå»ã®èšäºã§æ³ä»€apiãå©çšããããšãããã®ãšããŠã
- ïŒç§»åã»åæçš¿ïŒe-Govæ³ä»€APIãšXMLãPythonãçšããç¹å®ã¯ãŒããå«ãŸããæ¡ææœåº
- æ³ä»€APIãå©çšãããªãµãŒãããŒã«ãèªäœããŠã¿ããSmartRoppoã
- e-Gov æ³ä»€ããŒã¿ã掻çšãããã¡ã¢
ãªã©ãããããªã³ã©ã€ã³ç°å¢ã§æ³ä»€ãèŠãã®ã§ããã°ããããåç
§ããã°ããã®ã§ããããªãã©ã€ã³ç°å¢ã§ã®æ³ä»€å©çšãå°å·ããŠçŽåªäœã§ã®å©çšãããããšããããã®ã§ãæ³ä»€apiããååŸããæ³ä»€ã以äžã®ããã«é©åãªã¬ã€ã¢ãŠãã®pdfã«ããã¹ã¯ãªãããäœæããŸããã

ãªãããã®ã¬ã€ã¢ãŠãã¯ãJapanese Law PDF + XML æ¥æ¬ã®æ³åŸã®PDFãšXMLã§å
¬éãããŠããpdfãåèã«ããŠé
眮ããŠããŸããããã¡ãã®ããŒã ããŒãžã®æŽæ°ã2016å¹Žã§æ¢ãŸã£ãŠããããèªåã§äœã£ãŠã¿ããšããæ¬¡ç¬¬ã§ãã
以äžã§äœ¿ãæ¹çã«ã€ããŠçž·ã è¿°ã¹ãŠããŸãããåã«äœ¿ãã ãã§ããã°[(æ³åŠåŸã®ããã®)ç°å¢æ§ç¯](# (æ³åŠåŸã®ããã®)ç°å¢æ§ç¯)ãš[äœ¿ãæ¹](# äœ¿ãæ¹)ãèŠãã°è¶³ããããšæããŸããæ³ä»€apiãèªåã§æ±ã£ãããããã¯ç§ã®ã³ãŒããæ¹å€ãããªã©ãããæ¹ã®åèã«ããããã«[ã³ãŒãã®è§£èª¬](# ã³ãŒãã®è§£èª¬)ãæžããŠãããŸãããŸã[泚æäºé ](# 泚æäºé )ã§ã¯é©åã«åäœããªãå ŽåãèšèŒããŠããŸãã®ã§ãçæãã ããã
(æ³åŠåŸã®ããã®)ç°å¢æ§ç¯
åºæ¬çã«ã¯æ³åŠåŠç¿è
ã®åœ¹ã«ç«ã€ããã«äœã£ãŠããŸãããæ³åŠåŠç¿è
ã§PythonãTeXã«ãªãã¿ã®ããæ¹ãå¿
ãããå€ããªããšæããŸãã®ã§ãç°å¢æ§ç¯ã«ã€ããŠå°ã詳ããã«è¿°ã¹ãŠãããŸãã
Pythonããã³TeXã¯äœ¿ãããšããæ¹ã«ã¯äžèŠã§ãã®ã§èªã¿é£ã°ããŠãã ããã
Pythonãå°å ¥ãã
Pythonã®å
¬åŒãµã€ãããPythonã®ææ°çãããŠã³ããŒãããŸãã

åçã®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ã«èšå®ããŠãããŸãã

TeXã«é¢ããŠã¯ããã§èšå®ã¯å®äºã§ãã
ãã®ä»èºããããªç¹
[äœ¿ãæ¹](# äœ¿ãæ¹)ã®ãã¡èºãå¯èœæ§ãããéšåã詳现ã«è¿°ã¹ãŠãããŸãã
ã³ãŒãã®ããŠã³ããŒã
https://github.com/tbyuunagi/make_lawtex ã«ã¢ã¯ã»ã¹ããããåçã®Clone or downloadãæŒããŠãã ããã

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ã«èšå®ããããšã«ãªããŸãã
ãªããç®æ¬¡ã®è¡šç€ºãæ£ããããŒãžã§è¡ãããã«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ãªã©ã«ãç¥ããããã ãããšå¹žãã§ãã