法令APIをGoogle Colab (Python) からアクセスする

#概要
(全法令、政令・勅令、府省令まで取れる)法令APIの使い方を、(無料で使える)Google Colabを使って説明する。APIの使用については、[e-Gov 法令 API 仕様書](https://www.e-gov.go.jp/elaws/pdf/houreiapi_shiyosyo.pdf)を参照してほしい。
なお、ElementTreeを用いることにより、容易に打ち出しが出来ることがわかる。

なお、Excelファイルへの出力等は、国会議事録のAPIの検索の仕方を参照してほしい。

#法令名一覧取得API
法令一覧は、4章のコードにあるとおり、4種類(1から4まで)ある。ここでは、一般的な法令一覧を取得するコード例を示す。ここでは、(KEYWORDに設定して)日本国憲法のみを表示する例を示す。

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

if __name__ == '__main__':
    KEYWORD = u'日本国憲法'
    TAG     = u'LawName'
    url = 'https://elaws.e-gov.go.jp/api/1/lawlists/2'
    r = requests.get(url)
    root = ET.fromstring(r.content.decode(encoding='utf-8'))
    iflag = 0
    for e in root.getiterator():
      if (TAG     == e.tag):  iflag = 0
      if (KEYWORD == e.text): iflag = 1
      if(iflag == 1):
        print(e.tag, e.attrib, e.text )
```
出力例

```
LawName {} 日本国憲法
LawNo {} 昭和二十一年憲法
PromulgationDate {} 19461103
LawNameListInfo {} 
            
```

#法令取得API
以下のようにやると、法律を読める。

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

if __name__ == '__main__':
    url = 'https://elaws.e-gov.go.jp/api/1/lawdata/昭和二十一年憲法'
    r = requests.get(url)
    root = ET.fromstring(r.content.decode(encoding='utf-8'))
    for e in root.getiterator():
      print(e.tag, e.attrib, e.text )
```
出力例(長くなるので1条まで)

```
DataRoot {} 
    
Result {} 
        
Code {} 0
Message {} None
ApplData {} 
        
LawNum {} 昭和二十一年憲法
LawFullText {} 

Law {'Era': 'Showa', 'Lang': 'ja', 'LawType': 'Constitution', 'Num': '', 'Year': '21'} 
  
LawNum {} 昭和二十一年憲法
LawBody {} 
    
LawTitle {} 日本国憲法
Preamble {} 
      
Paragraph {'Hide': 'false', 'Num': '1', 'OldStyle': 'false'} 
        
ParagraphNum {} None
ParagraphSentence {} 
          
Sentence {'WritingMode': 'vertical'} 日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。
Paragraph {'Hide': 'false', 'Num': '2', 'OldStyle': 'false'} 
        
ParagraphNum {} None
ParagraphSentence {} 
          
Sentence {'WritingMode': 'vertical'} 日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。
Paragraph {'Hide': 'false', 'Num': '3', 'OldStyle': 'false'} 
        
ParagraphNum {} None
ParagraphSentence {} 
          
Sentence {'WritingMode': 'vertical'} われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。
Paragraph {'Hide': 'false', 'Num': '4', 'OldStyle': 'false'} 
        
ParagraphNum {} None
ParagraphSentence {} 
          
Sentence {'WritingMode': 'vertical'} 日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。
MainProvision {} 
      
Chapter {'Delete': 'false', 'Hide': 'false', 'Num': '1'} 
        
ChapterTitle {} 第一章　天皇
Article {'Delete': 'false', 'Hide': 'false', 'Num': '1'} 
          
ArticleTitle {} 第一条
Paragraph {'Hide': 'false', 'Num': '1', 'OldStyle': 'false'} 
            
ParagraphNum {} None
ParagraphSentence {} 
              
Sentence {'WritingMode': 'vertical'} 天皇は、日本国の象徴であり日本国民統合の象徴であつて、この地位は、主権の存する日本国民の総意に基く。
```

#条文内容取得API
法令取得APIで、条番号等を特定し読み出す。ここでは、日本国憲法14条を例に出す。

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

if __name__ == '__main__':
    url = 'https://elaws.e-gov.go.jp/api/1/lawdata/昭和二十一年憲法'
    url = 'https://elaws.e-gov.go.jp/api/1/articles;lawNum=昭和二十一年憲法;article=14'
    r = requests.get(url)
    root = ET.fromstring(r.content.decode(encoding='utf-8'))
    for e in root.getiterator():
      print(e.tag, e.attrib, e.text )
```
出力例

```
DataRoot {} 
    
Result {} 
        
Code {} 0
Message {} None
ApplData {} 
        
LawNum {} 昭和二十一年憲法
Article {} 14
Paragraph {} None
AppdxTable {} None
LawContents {} 
        
Article {'Delete': 'false', 'Hide': 'false', 'Num': '14'} 
          
ArticleTitle {} 第十四条
Paragraph {'Hide': 'false', 'Num': '1', 'OldStyle': 'false'} 
            
ParagraphNum {} None
ParagraphSentence {} 
              
Sentence {'WritingMode': 'vertical'} すべて国民は、法の下に平等であつて、人種、信条、性別、社会的身分又は門地により、政治的、経済的又は社会的関係において、差別されない。
Paragraph {'Hide': 'false', 'Num': '2', 'OldStyle': 'false'} 
            
ParagraphNum {} ○２
ParagraphSentence {} 
              
Sentence {'WritingMode': 'vertical'} 華族その他の貴族の制度は、これを認めない。
Paragraph {'Hide': 'false', 'Num': '3', 'OldStyle': 'false'} 
            
ParagraphNum {} ○３
ParagraphSentence {} 
              
Sentence {'Num': '1', 'WritingMode': 'vertical'} 栄誉、勲章その他の栄典の授与は、いかなる特権も伴はない。
Sentence {'Num': '2', 'WritingMode': 'vertical'} 栄典の授与は、現にこれを有し、又は将来これを受ける者の一代に限り、その効力を有する。
```

#その他
- curlでは、そのままAPIを叩くことが出来た。しかしwgetではエラーとなった。(これについては、質問中)
- 法令取得APIのLawBody構造が複雑に見える(これについても、質問中)　untangleでは無く、ElementTreeを使うと簡単に全要素打ち出せることがわかったので、必要性低下

#参考資料
- (総務省 e-Gov)[法令APIについて](https://www.e-gov.go.jp/elaws/interface_api/index.html)
- (Python)[20.5. xml.etree.ElementTree — ElementTree XML API](https://docs.python.jp/3/library/xml.etree.elementtree.html)