1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

e-Gov法令検索サイトのAPIを実行して、法令の更新情報をダウンロードするスクリプトを作成しました

1
Last updated at Posted at 2026-03-11

はじめに

お疲れさまです。
個人開発やサービス開発に挑戦される方の中には、

  • 開発しようとしている機能(一例: ユーザー間のメッセージ送受信、課金・決済 等)
  • 取り扱うデータの属性(一例: 個人情報、機微情報、機密情報、等)

によって、どの法律・法令が関係するのか?、法令の更新情報をどうキャッチすれば良いのか?悩んだ経験はございませんか?

執筆者 自身は、個人開発していきたいサービスやシステムがありまして、関連する法律・法令の更新情報をキャッチしたいと考えております。

本記事は、デジタル庁様が提供してくださっている e-Gov法令検索サイト法令API Version 2 を利用して、法令の更新情報をダウンロードするスクリプトを作成しましたのでご紹介となります。

スクリプトはbashで作成しており、何らかのライブラリやパッケージ等を導入せずとも、実行いただけます。

なお、記事の最後、記事作成のきっかけ、私の個人的な思いを綴った文章がございます。直接的な技術情報とは関係ない、ポエム的な内容ですが、ご容赦ください。

記事内の用語について

  • 法律
    • 法律は国会が制定する法規(法律、政令、省令、規則、条例、条約などの総称)のこと。
  • 法令
    • 法律に加え、内閣が定める「政令」、各省大臣様が定める「省令」などを含めた総称のこと。

e-Gov法令検索サイトの概要について

スクリプト実行環境について

  • 後述のコマンドは、MacOS(macOS Tahoe)のcurlコマンドで動作を確認しております。

法令の更新情報取得スクリプト作成

(1) 任意のディレクトリで、以下のbashスクリプトを作成します。

% vi download_egov_laws_updates_info.sh

以下の内容をコピーペーストして、スクリプトに記載します。

download_egov_laws_updates_info.sh
#!/usr/bin/env bash
set -euo pipefail

# ============================================
# e-Gov法令API bulkdownload 取得&一覧化スクリプト
# 使い方:
#   ./download_egov_laws_updates_info.sh 20260311 "個人情報保護"
#
# 生成物:
#   download_info_20260311/
#     ├── legal_updates_YYYYMMDD.zip
#     ├── extracted/...
#     ├── law_list_YYYYMMDD.csv
#     ├── law_list_YYYYMMDD.tsv
#     └── grep_target_YYYYMMDD.txt
# ============================================

if [[ $# -lt 1 ]]; then
  echo "使い方: $0 YYYYMMDD(e.g. 20260311) [grep_keyword]" >&2
  exit 1
fi

TARGET_DATE="$1"
GREP_KEYWORD="${2:-}"

if ! [[ "$TARGET_DATE" =~ ^[0-9]{8}$ ]]; then
  echo "エラー: 日付は YYYYMMDD 形式で指定してください。例: 20260311" >&2
  exit 1
fi

BASE_URL="https://laws.e-gov.go.jp/bulkdownload?file_section=3&update_date=${TARGET_DATE}&only_xml_flag=true"

WORK_DIR="download_info_${TARGET_DATE}"
ZIP_FILE="${WORK_DIR}/legal_updates_${TARGET_DATE}.zip"
EXTRACT_DIR="${WORK_DIR}/extracted"
CSV_FILE="${WORK_DIR}/law_list_${TARGET_DATE}.csv"
TSV_FILE="${WORK_DIR}/law_list_${TARGET_DATE}.tsv"
GREP_FILE="${WORK_DIR}/grep_target_${TARGET_DATE}.txt"

mkdir -p "$WORK_DIR" "$EXTRACT_DIR"

echo "==> ZIPダウンロード開始: ${BASE_URL}"
echo "ZIPダウンロード実行のHTTPステータスコード"
curl -s -w '%{http_code}\n' -fL -o "$ZIP_FILE" "$BASE_URL"

echo "==> ダウンロードファイル種別確認"
file "$ZIP_FILE"

echo "==> ZIP展開開始"
unzip -oq "$ZIP_FILE" -d "$EXTRACT_DIR"

echo "==> XML一覧を走査してCSV/TSV生成"

tmp_tsv="$(mktemp)"
tmp_csv="$(mktemp)"

# ヘッダ
printf 'update_date\tlaw_num\tlaw_title\tfile_path\n' > "$tmp_tsv"
printf '"update_date","law_num","law_title","file_path"\n' > "$tmp_csv"

find "$EXTRACT_DIR" -type f -name '*.xml' | while read -r f; do
  parent_dir="$(basename "$(dirname "$f")")"

  # ディレクトリ名例:
  # 325AC0000000144_20261001_507AC0000000087
  # → 真ん中の 20261001 を更新日として抽出
  raw_update_date="$(echo "$parent_dir" | awk -F'_' '{print $2}')"

  # 念のため 8桁チェック。取れなければ空欄とする
  if [[ "$raw_update_date" =~ ^[0-9]{8}$ ]]; then
    update_date="$raw_update_date"
  else
    update_date=""
  fi

  law_num="$(xmllint --xpath 'string(/Law/LawNum)' "$f" 2>/dev/null || true)"
  law_title="$(xmllint --xpath 'string(/Law/LawBody/LawTitle)' "$f" 2>/dev/null || true)"

  # TSV用: タブ/改行を除去
  law_num_tsv="$(printf '%s' "$law_num" | tr '\t\r\n' '   ')"
  law_title_tsv="$(printf '%s' "$law_title" | tr '\t\r\n' '   ')"
  file_path_tsv="$(printf '%s' "$f" | tr '\t\r\n' '   ')"

  printf '%s\t%s\t%s\t%s\n' \
    "$update_date" "$law_num_tsv" "$law_title_tsv" "$file_path_tsv" >> "$tmp_tsv"

  # CSV用: ダブルクォートをエスケープ
  law_num_csv="$(printf '%s' "$law_num" | sed 's/"/""/g')"
  law_title_csv="$(printf '%s' "$law_title" | sed 's/"/""/g')"
  file_path_csv="$(printf '%s' "$f" | sed 's/"/""/g')"

  printf '"%s","%s","%s","%s"\n' \
    "$update_date" "$law_num_csv" "$law_title_csv" "$file_path_csv" >> "$tmp_csv"
done

# ヘッダを除いて update_date で降順ソートする
{
  head -n 1 "$tmp_tsv"
  tail -n +2 "$tmp_tsv" | sort -r -k1,1
} > "$TSV_FILE"

{
  head -n 1 "$tmp_csv"
  tail -n +2 "$tmp_csv" | sort -r -t, -k1,1
} > "$CSV_FILE"

# grepしやすい検索用テキスト
# 例:
# 20261001 | 昭和二十五年法律第百四十四号 | 個人情報保護法 | download_egov_laws_updates_info_20260311/extracted/...
awk -F '\t' 'NR>1 {
  printf "%s | %s | %s | %s\n", $1, $2, $3, $4
}' "$TSV_FILE" > "$GREP_FILE"

rm -f "$tmp_tsv" "$tmp_csv"

echo "==> 完了"
echo "作成ファイル:"
echo "  CSV : $CSV_FILE"
echo "  TSV : $TSV_FILE"
echo "  GREP: $GREP_FILE"

echo
echo "==> 先頭5件プレビュー"
head -n 5 "$TSV_FILE"

echo
echo "==> grepしやすい検索例"
echo "  grep '個人情報保護法' '$GREP_FILE'"
echo "  grep '昭和二十五年法律第百四十四号' '$GREP_FILE'"

if [[ -n "$GREP_KEYWORD" ]]; then
  echo
  echo "==> キーワード検索: $GREP_KEYWORD"
  grep -n --color=always "$GREP_KEYWORD" "$GREP_FILE" || true
fi

(2) 作成したスクリプトに実行権限を付与します。

% chmod 755 download_egov_laws_updates_info.sh

スクリプトを実行して、法令の更新情報をダウンロードする例

(1) 前述のスクリプトを実行し、e-Gov法令検索サイトのAPIを実行して、法令の更新情報をダウンロードします。

  • 実行方法は以下になります。
% ./download_egov_laws_updates_info.sh [YYYYMMDD] [取得した更新情報のうち検索したい法令名]
  • 実行例は以下になります。

ここでは、例として、消費税法 の更新を確認しています。

% ./download_egov_laws_updates_info.sh 20260311 消費税法

もし、個人情報保護法 について更新を確認されたい場合、以下のように実行します。

% ./download_egov_laws_updates_info.sh 20260311 個人情報保護法

以下がスクリプトを実際に実行した例です。

  • スクリプトを実行すると、e-Gov法令検索サイトのAPIを実行して、法令の更新情報をZIPダウンロード、ダウンロードしたZIPファイルを展開、[取得した更新情報のうち検索したい法令名] を検索できます。

  • ダウンロード・展開したZIPファイルは、後述のスクリプト実行ディレクトリ配下に download_info_20260311 ディレクトリに保存されます。

% ./download_egov_laws_updates_info.sh 20260311 消費税法         
==> ZIPダウンロード開始: https://laws.e-gov.go.jp/bulkdownload?file_section=3&update_date=20260311&only_xml_flag=true
ZIPダウンロード実行のHTTPステータスコード
200
==> ダウンロードファイル種別確認
download_info_20260311/legal_updates_20260311.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
==> ZIP展開開始
==> XML一覧を走査してCSV/TSV生成
==> 完了
作成ファイル:
  CSV : download_info_20260311/law_list_20260311.csv
  TSV : download_info_20260311/law_list_20260311.tsv
  GREP: download_info_20260311/grep_target_20260311.txt

==> 先頭5件プレビュー
update_date	law_num	law_title	file_path
21171231	平成十九年法律第二十三号	特別会計に関する法律	download_info_20260311/extracted/419AC0000000023_21171231_351AC0000000038/419AC0000000023_21171231_351AC0000000038.xml
20300619	昭和六十三年法律第百八号	消費税法	download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml
20300619	昭和四十二年法律第八十一号	住民基本台帳法	download_info_20260311/extracted/342AC0000000081_20300619_507AC0000000074/342AC0000000081_20300619_507AC0000000074.xml
20291211	昭和四十二年法律第八十一号	住民基本台帳法	download_info_20260311/extracted/342AC0000000081_20291211_507AC0000000087/342AC0000000081_20291211_507AC0000000087.xml

==> grepしやすい検索例
  grep '個人情報保護法' 'download_info_20260311/grep_target_20260311.txt'
  grep '昭和二十五年法律第百四十四号' 'download_info_20260311/grep_target_20260311.txt'

==> キーワード検索: 消費税法
2:20300619 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml
95:20270401 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20270401_506AC0000000060/363AC0000000108_20270401_506AC0000000060.xml
106:20270101 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20270101_507AC0000000013/363AC0000000108_20270101_507AC0000000013.xml
111:20261101 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261101_507AC0000000013/363AC0000000108_20261101_507AC0000000013.xml
130:20261001 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261001_507AC0000000070/363AC0000000108_20261001_507AC0000000070.xml
131:20261001 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261001_507AC0000000013/363AC0000000108_20261001_507AC0000000013.xml
%

(2) 法令の更新情報を全て確認したい場合、ダウンロードZIPを展開したディレクトリ内を確認します。

  • 法令の更新情報をZIPダウンロードし、展開した内容については、スクリプト実行ディクレクトリ配下に download_info_20260311 ディレクトリとして保存されます。
    • スクリプト実行時、指定した日付のディレクトリに保存されます。
 % ls -lrta
total 16
-rwxr-xr-x   1 *******  staff  4292  3月 12 00:58 download_egov_laws_updates_info.sh
drwxr-x---+ 75 *******  staff  2400  3月 12 00:58 ..
drwxr-xr-x   7 *******  staff   224  3月 12 00:58 download_info_20260311
drwxr-xr-x   4 *******  staff   128  3月 12 01:05 .
 % 
% ls -lrta download_info_20260311
total 35184
drwxr-xr-x    7 *******  staff       224  3月 12 00:58 .
-rw-r--r--    1 *******  staff  17280687  3月 12 01:02 legal_updates_20260311.zip
drwxr-xr-x  170 *******  staff      5440  3月 12 01:02 extracted
-rw-r--r--    1 *******  staff     37299  3月 12 01:03 law_list_20260311.tsv
-rw-r--r--    1 *******  staff     38643  3月 12 01:03 law_list_20260311.csv
-rw-r--r--    1 *******  staff     38261  3月 12 01:03 grep_target_20260311.txt
drwxr-xr-x    4 *******  staff       128  3月 12 01:05 ..
% 

download_info_20260311/law_list_20260311.csv に全文が記載されております。

% head -5 download_info_20260311/law_list_20260311.csv
"update_date","law_num","law_title","file_path"
"21171231","平成十九年法律第二十三号","特別会計に関する法律","download_info_20260311/extracted/419AC0000000023_21171231_351AC0000000038/419AC0000000023_21171231_351AC0000000038.xml"
"20300619","昭和六十三年法律第百八号","消費税法","download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml"
"20300619","昭和四十二年法律第八十一号","住民基本台帳法","download_info_20260311/extracted/342AC0000000081_20300619_507AC0000000074/342AC0000000081_20300619_507AC0000000074.xml"
"20291211","昭和四十二年法律第八十一号","住民基本台帳法","download_info_20260311/extracted/342AC0000000081_20291211_507AC0000000087/342AC0000000081_20291211_507AC0000000087.xml"
% 

終わりに

記事を閲覧いただき、ありがとうございます。

個人開発やサービス開発などに挑戦される方の中で、e-Gov法令検索サイトで、関係する法律・法令の更新情報、どうキャッチすればよいだろう?と悩まれている方がいましたら、少しでもご参考になれば幸いです。

執筆者の個人的な思い (ポエム)

純粋な技術情報とは無関係で、ポエム的要素がありますが、最後に執筆者の思いについて、少しだけ綴らせてください。

私自身として、今後、解決に取り組みたいと考えている課題感がございまして、いくつか考えている仕組み、サービス、システムがございます。

私自身、諸般の事情により、内心、孤独を感じることが多いのですが、
形は違えども、様々な事情により、孤独や悲しさを抱え、一人涙している方が他にもいらっしゃるかもしれません。

まだ完全に言語化しきれていないですが、今後、

  • 「人が孤独で壊れにくい社会をつくる」

ことを目指しておりまして、

  • 人と人を繋ぐ大切な言葉、この「言葉のリスクを見える化し、やさしいコミュニケーションを支える仕組みを提供する」

ことに取り組みます。

新しい仕組み、サービスやシステムを検討・実現していくにあたり、やはり、ユーザーさまが安心してサービスやシステムをご利用いただけるようにしたいと考えておりまして、

そのため、開発するサービスやシステムの機能、ユーザーさまからお預かりするデータによって、関連する法律・法令を確認・遵守、法令の更新情報も確認してまいりたいと思います。

以上となります。

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?