給程式設計師的法律條文教學(三):立法院法律系統網站分析

本篇以網站的使用為主要流程,不會寫程式的朋友仍可當作網站介紹來看(是說官方根本就有自己的操作說明頁面)。



前言

日前去參加零時政府的活動,目前已有個lawEasyRead專案(JSONP API)由其他前輩開發中(技術上我目前完全沒沾上邊);我之前的zhLawEasyRead(Google Chrome extension)也放上GitHub了,不過就只是放上去(2012)年做的版本而已,並沒有更新。
2013-08-12修改瀏覽器外掛已放上Chrome 線上應用程式商店,歡迎使用Google瀏覽器的朋友點選安裝,或是到這邊試用;原始碼則可見於g0v/laweasyread-front

[零時政府]最近的相關新聞是Google瀏覽器的外掛[求職小幫手],介紹可參閱壹電視重灌狂人,我在噗浪上另有感觸。

本文中提到的網址格式中,大部分的特殊字元將被還原顯示,以利閱讀,但實際處理網址時仍須將特殊字元還原(特別是'+'和'=')。
另外,我並沒有理解網址格式在該站中代表的意義,本文只是試著歸納出格式。


網站概述

首頁:http://lis.ly.gov.tw/lgcgi/lglaw


資料

僅包含至「法律」層級,沒有法規命令和行政規則。
不過要查很早的法規(例如從沒施行過的〈最低工資法〉)倒是沒什麼問題。

最常見的用法就是搜尋到想找的法律之後,再選擇看全文或是立法紀錄。
但是民國59年以前的立法紀錄是沒有的,所以在那之前制定、而從未修正過的法條,就也不會有立法理由。
(不過應該還是在某處有資料,畢竟有些學習式法典還是有辦法把立法理由列出來,例如我手邊的許玉秀大法官編纂的刑法法典。)


特色

  • 每個法律有自己的ID,格式是 "%05d" ,所以可以用整數儲存(轉字串時記得補零)。
    以下用{lyID}表示這個ID。
  • 民法的五編是前述規則的例外,五編有各自的ID。這點需要作例外處理。
  • 「總統副總統選舉罷免法(民國36年)」(lyID 04311)和「總統副總統選舉罷免法」(lyID 04318)是不一樣的。
  • 列出的法律超過一百條時,會有「下一頁」的按鈕。但它是一個<input type="image" />,不是<a href />,這在嘗試列出所有法律時會是個困擾。


單一法律頁面綜覽

每個法律有四種主要頁面:全文、立法紀錄法條沿革修正沿革。
其中「立法紀錄」僅有民國59年之後的會有連結出現,所以要用程式抓出連結時,不宜使用「找第n個tag A」這種方式。
網址格式:
http://lis.ly.gov.tw/lgcgi/lglaw?@{Weird}:1804289383:f:{Format_A}$${Format_B}
  • {Weird}:不知道是幹啥的兩碼,觀察了幾次其作用跟session有點像,大抵是故意不讓系統有永久連結,如果過了一兩個小時(不確定切確時間),會出現錯誤訊息如:
    System message:E7 TimeOut 47:1366463327:1366458911:3600
    要注意的是:如果隨便亂打,還是可能會有網頁跑出來,但是內部的資料就會跟正確的「不盡相同」,如果沒有跟正確的對照,可能甚至不會發現錯誤。
    也由於這個設計的關係,本文中許多地方沒法放直接連結,還請讀者另開頁面手動輸入檢索。
  • [全  文] (中間兩個全形空白)
    • {Format_A} → "NO=C7{lyID}* OR NO=C0{lyID} OR NO=C1{lyID}"
    • {Format_B} → "4$$$NO"
  • 條文:僅在「全文檢索」時有在「法律全文」文字框中有輸入資料時出現。
    • {Format_A} → "NO=C7{lyID}*"
    • {Format_B} → "5$$$NO"
  • 立法紀錄
    • {Format_A} → "NO=B{lyID}* AND NO=A2"
    • {Format_B} → "6$$$PD"
  • 法條沿革
    • {Format_A} → "NO=E{lyID}* OR NO=B{lyID}"
    • {Format_B} → "10$$$NO-PD"
  • 修正沿革
    • {Format_A} → "NO=E{lyID}* OR NO=B{lyID}"
    • {Format_B} → "11$$$PD+NO"
其實只需要「法條沿革」和「修正沿革」這兩頁就可以取得歷次修法結果與修法理由。但是除了需要先解決網址中的{Weird}到底是甚麼之外,就會沒能得知公告日與施行日的資訊了。以下還是以「全文」開始分析:


全文

網址格式是:
  • {Format_A} → "NO=C7{lyID}* OR NO=C0{lyID} OR NO=C1{lyID}"
  • {Format_B} → "4$$$NO"
頁面中先顯示法律名稱和其{lyID};
接著是與該法有關的日期,日期分為三種:三讀日、公布日、施行日,其中施行日並不會每次出現,詳後述;
再接著則是法規的條文,有些法條會再有「相關條文」的連結。


[法名稱]

進入全文頁面後,再次點選該法的名字,即可連結到立法多元資料庫檢索系統。(注意:這個系統名稱裡沒有「院」字)
理想上應該僅列出該法從提案開始的所有文書與紀錄,但實際上是到該檢索系統以法律名稱當作關鍵字搜尋,我測試時發現會有這兩種理想上不該出現的搜尋結果:
  • 名稱包含別的法律名稱的法律。
    例如在「破產法」的頁面中再去點選「破產法」字樣,則會把「破產法施行法」的相關資料也列出。
  • 書籍。預設是有搜尋國會圖書館的。
該聯結的格式為:
http://lis.ly.gov.tw/lgcgi/ttsalldb?@0^0^1^alldbout!({Format_C})@LW,WL,KW,TI,MC@@
其中 {Format_C}(連結中被半形括號框住) 是把法律的名稱中每個字換成 "%2f%2f" 或是 "%3f" 的格式,例如「法」字會轉成 "%AAk",「條例」則會是 "%B1%F8%A8%D2",編碼方式似乎不是BIG-5也不是UTF-8。
連結格式最後的 "LW,WL,KW,TI,MC" 似乎即是指定資料庫,例如把 ",TI" 拿掉的話,就不會出現書籍了。
在相關日期列表中(以HTML元素TABLE排版),原則上有三種日期,不同日期之間不一定會照順序排列:

三讀日
指「立法院」的法律案三讀通過之日,日期置於table-row的第一個cell,第二個cell則描述該次三讀的內容。可能出現數種動詞:
  • 制定:恰好出現一次,有時有較詳細的描述,如憲法兒少法
  • 修正、增訂、刪除:
    組合出現,其相互順序可參閱行政訴訟法100年11月1日的敘述(注意多個條文會被併寫,但分區卻是分列);
    亦可能包含多個施行日的說明,例如個人資料保護法
  • 廢止:至多出現一次;如果出現,必是最後一次。範例可於系統最上方「廢止法瀏覽」隨意點選。
  • 停止適用:完整文字為「立法院通過停止適用」,大抵意思是「暫時不用,不過之後有回復使用的可能。」列表參閱該網站上方最右側的「停止適用法瀏覽」。
    公布日
    指「總統」依憲法規定公布之日
    • 動詞接在日期後面,併載於該table-row的第一個cell。
    • 通常即是總統府公報的日期(系統中似乎沒有公文字號,尚難直接連結到該公報的電子檔)
    • 每個三讀日必有恰好一個公布日,但是同一個法的多個三讀卻可能有相同的公布日。
      例如道路交通管理處罰條例於100年11月的4日與8日都被修過,但卻在同一天用同一份總統府公報(第7004期PDF檔)中,用不同的總統令字號(華總一義字第1000025969110000259801號)公布。
    • 我不確定「三讀通過後、總統公布前」的法律會不會被放在系統中,這幾天或許可以追民訴、非訟、少家組織的相應網頁更新進度。
      施行日
      指法律開始生效的日期
      • 動詞接在日期後面,併載於該table-row的第一個cell。
      • 一次修法可能針對不同條文而有二個以上的施行日。此種情形下似乎就「不會」另列施行日,而是於三讀日的說明中詳述,例如個人資料保護法
      • 前一次三讀的條文的施行日,有可能晚於下一次三讀日,道路交通管理處罰條例於前段所述的二次即為著例。
      • 由於「開始施行」的可能很多,應該是三種日期中最麻煩的一種。施行的可能情形有:
        • 自公布日施行--但依照中央法規標準法第13條釋字第161號,其實還要隔兩天才生效。這個情形下不會列出施行日。
        • 法規中明定施行日期--通常寫在最後一條。
        • 於施行法(法律層級)明定施行日期。有「施行法」的法律可參見全國法規資料庫。另注意國際公約雖可能有施行法,但該公約本身卻不會在立法院法律資料庫出現。
          由於施行法也是法律,所以也會有自己的三讀日、公布日、施行日。
        • 於施行細則(命令層級)明定施行日期,但並不是有施行細則的法律就一定是在施行細則中明定施行日期。
        • 由行政機關(不是總統)發布(不是「公布」)一個「公告」來宣布施行日。
        其他
        大多跟政府迫遷來台有關。
        • 例如動員戡亂時期臨時條款
          • 「民國43年3月11日決議本條款繼續有效」:
            日期部分沒有「中華」二字、數字前後沒有空格;
            整個字串放在該table-row第一個cell;
            似乎屬於立法院的法律案性質,但卻沒有相應的總統公布令。
          • 總統令公告廢止:不是「公布」;沒有相應的三讀;敘述置於該table-row第二個cell。
          • 停止適用:已於「三讀日」併論。
            不同日期間亦可能重複,例如101年11月4日既是社會秩序維護法的三讀日,也是公布日。(另可參閱我對此的批評


            歷次法版本

            三讀日中,除了「廢止」和「停止適用」之外,點選日期即可查閱該法律於該次三讀後的全部條文。歷次法版本的特色為:
            • 靜態網址格式為:
              http://lis.ly.gov.tw/lghtml/lawstat/version2/{lyID}/{lyID}{Date}00.htm
              其中{Date}是六碼七碼,依序為十進位的民國紀年、月份、日期,年不補零,但月和日會補零。
            • 利用HTML中的換行字元或BR標籤,再配合行首字即可自動判斷該行是項、款或目、小目等。
            • 如果是最新版本條文,在「各個」條號的後面會有該條的標題;
              如果不是最新版,則會在「所有」條文前面的日期上標註「(非現行條文)」
            • 可能會有「立法理由」連結
              • 民國59年以後制訂或修改的才會有
              • 靜態網頁的網址格式為:
                http://lis.ly.gov.tw/lghtml/lawstat/reason2/{lyID}{Date}00.htm與歷次法版本不同,路徑 reason2/ 之下並沒有依{lyID}而再區分目錄。
              • 會列出該次修法後的條文內容和理由,但「不會」列出修改前的內容。
              • 每個條號旁會標註動詞,除了制定、修正、增訂之外,「刪除」也會被列出,另需注意還有「全文修正」(如99年的個資法修正)。
              • 改過名字的法律,其舊版「不會」顯示舊的名稱,如個資法在民國84年應該要叫做「電腦處理個人資料保護法」(但是其全文靜態頁面顯示的名字是對的)。
              • 立法理由其實只是某一個提案版本的說明欄,很可能跟實際的修法情形並不一致(最常見的是項款順序的差異)。
            • 可能會有「立法紀錄」連結
              • 列出歷次相關開會日期、公報中該日討論該法的記錄連結和關係文書(PDF檔)
              • 法條全文的連結是動態連結,格式:
                http://lis.ly.gov.tw/lgcgi/lglawproc?{lyID}{Date}00
              • 點選前述連結後,會被轉到靜態網頁,網址格式為:
                http://lis.ly.gov.tw/lghtml/lawstat/pdfwork/{ShortInt}.htm
                其中{ShortInt}為300~32767的十進位整數(不補零),但似乎又不是照日期排列的流水號。我沒發現其他特徵、不知超過32767的會怎樣。
              • 公報紀錄與關係文書留待後述。


            條文列表

            法條全文原則上與最新三讀日連結過去的靜態網頁相同,差別在HTML內的格式不同:
            • 法條標題的右括號前多了兩個換行,造成顯示時多了個空格。
            • 各項、款之間不再有換行字元,而只剩 BR 標籤。
            • 每條的末尾「可能」有「[相關條文]」的連結。


            相關條文

            分別列出「引用條文」和「被引用條文」,網址格式為:
            http://lis.ly.gov.tw/lghtml/lawstat/relarti/{lyID}/{lyID}{ArticleNumber}{SubNumber}.htm
            其中{ArticleNumber}為條號主數字,格式為"%04d";{SubNumber}為「之X」,格式為"%02d"(可能為"00")。
            注意憲法其增修條文有「前言」,格式同「第零條之零」。

            此網址格式可以作為儲存資料格式的靈感,也就是用一個整數即可當作一個條號的primary key,不需要用兩個整數來存,也不需要用不利於排序的字串來存。(字串儲存的缺點是:第77-2在排序時會被排在第77-10條之後)
            以此方式儲存亦不需擔心{SubNumber}會超過99(我知道最多是民訴的第77-27條),唯一的缺點大概只有不能用short integer (2 bytes)儲存吧(因為民法超過1200條)。

            本頁特色為:
            • 只有最新版能夠用這個方式得知相關條文,意即:舊版的法條是找不到這個連結的。
            • 民法各編雖有各自的lyID,但是{ArticleNumber}仍與實際條號相同。
            • 相關條文分為「引用條文」和「被引用條文」且似乎是雙向的,亦即:條文X提及了條文Y的話,那麼X的該頁會將Y列為「引用條文」,而Y的該頁會將X列為「被引用條文」。
              但如果兩個條文互相提及,那麼既是「引用」也是「被引用」(電腦處理時需小心無窮迴圈),且也因此會在頁面中出現兩次。
            • 對於「第X條至第Y條」的情形有處理,條號介於X與Y的亦會被列出。
            • 對於「前條」這種引用的判定方式不明,例如行政訴訟法§237-4的該頁「沒有」將§237-3列為「引用條文」,但卻將§273-5列為「被引用條文」。
            • 只提及法律、罪名、分區而沒有指定條文的,不會被列出,例如:
            • 憲法其增修條文的「前言」於此似乎又是個例外,並不單純是分析條文中的字串,而是提及「憲法」或「增修條文」的,就會被當作「引用前言」--我是覺得不用特別處理。
              「前言」被列出時,會標為「第零條」,例如國徽國旗法§4的該頁
            待確認:假設A法中的條文X引用了B法中的條文Y,但後來B法全文修正後,條文Y的條號更動,那麼這時雙方列出的「相關條文」會是甚麼樣子?


            附件

            很少見,目前我只知道國徽國旗法第17條有附件。附件的網址是
            http://lis.ly.gov.tw/lgcgi/lylawatt?{HEXES}
            那個{HEXES}的格式似乎跟後續的「關係文書」相同(不過cgi程式的名稱不同)
            除了「全文」之外,附件的列表與連結,在「相關法條」頁面中雖不會被列出,但「歷次法版本」的靜態頁面中會被列出。不過國徽國旗法民國17年43年列出的方式很不相同。


            個別條文搜尋

            僅在「全文檢索」模式有在「法律全文」文字框中有輸入資料時,「[全  文]」右側會出現「條文」連結。
            網址格式是:(忘記這是啥的請回頁首吧QQ)

            • {Format_A} → "NO=C7{lyID}*"
            • {Format_B} → "5$$$NO"

            由網址格式可知,這是一個session dependent的頁面。
            點入後,會列出該法律中,包含搜尋字串的條文,以及該條文的分區與相關條文連結。
            或許不適合用來自動擷取資料,不過另外寫頁面讓使用者連過來應該是可行的。



            立法紀錄

            網址格式是:
            • {Format_A} → "NO=B{lyID}* AND NO=A2"
            • {Format_B} → "6$$$PD"
            與前述「歷次法版本」的頁面不同,這裡的日期顯示是有將年份補零的,也就是一律七碼。
            本頁面可以說是一個法律的各個「歷次法版本」中的「立法紀錄」連結到的各個檔案的彙整。(好啦我知道這句話很長)
            以下以道路交通管理處罰條例的該頁面為例(不便放連結,請另開視窗檢索之吧),依表格各欄的意義分別說明:


            三讀日期

            相應於前述的每一次三讀日,每次修法的整個程序中的會議資料會集中在同一區塊。排版上,每個修法版本的前面(除了第一列)都會多一行空白列。
            「三讀日期」欄位在此表格中可以當作一個<th scope="rowgroup" />來看,儘管HTML中並沒有這樣描述(連rowspan或colspan都沒有使用)。


            審查委員會

            • 可能有多個委員會,而以空格分隔。
            • 委員會的組合相同時,不一定每次的排序亦相同(如三讀日期05801140640711),不過我印象中這個排序是有意義的。
            • 不一定每次都會列出委員會,(如三讀日期0880330;另外社會秩序維護法僅有第一次列出)但必定跟著一個前述的「三讀日期」。亦即同一次修法只會有固定的委員會組合。
            • 不一定每次都會略去「委員會」三字(如三讀日期1000422

            進度

            三種讀會的順序為:
            • 一讀:一個以上,必為開頭(但日期不一定最早,詳後述)
            • 二讀(廣泛討論):零個以上
            • 二讀(逐條討論):一個以上
            • 三讀:一個以上(通常只有一個,例外如三讀日期0960112),必為結尾
            另外還有「委員會審查」和「黨團協商」,似乎在兩種二讀的前、中、後均可能穿插(例如三讀日期1001104)。

            資料來源

            會列出:
            • 會議日期
            • 立法院公報中該次會議紀錄的
              • 頁次
              • PDF連結
            首先注意會議日期的順序:雖然一讀都會被列在最前面,但在有多次一讀時,仍可能發生委員會審查早於最後一次一讀的時間,例如三讀日期1000503
            制度說明:一次修法可能有多方提出多種修法版本,每次「一讀」就是將一個版本的標題讀過一遍,承認該版本進入立法院的程序。由於二讀之前都可以提案,所以第一次委員會審查就有可能晚於最後一個被「一讀」的版本。
            所以每次修法的相關資料排序大概可以這樣理解:先分為一讀、其他、三讀三種類別,然後各類別再各自依日期排序。

            文字格式:
            • 會議日期:年份會補零,共七碼
            • 卷次「不一定」補零,特別是97, 98, 99和097, 098, 099都有可能出現。
            • 期次「不一定」補零,看來是民國100年的二月或三月時開始才改為 "%03d" 的格式的
            • 「號」字必會出現,例如前兩次修法。(公報的「號」似乎是民國60年左右開始的流水號,不分卷期而依序往下編,所以數字才會越來越大)
            • 「冊」不一定會出現,其編號除了中文數字、阿拉伯數字外,最討厭的是也會分上中下冊。
            • 可能有多餘的空白,例如一讀日期1000222的「第一 冊」。
            • 就算只有單頁,仍會以 "%d~%d" 的格式顯示。(這點倒是不錯)
            網址則是連向部分會議記錄的PDF檔(內容是掃描圖),格式有兩種:
            • 98年以前的,格式為
              http://lis.ly.gov.tw/ttscgi/lgimg?@{YEAR_2}{VOL_02}{BOOK_02};{PageStart_04};{PageEnd_04}
            • 99年以後的,格式為
              http://lis.ly.gov.tw/lgcgi/lypdftxt?{YEAR_03}{VOL_03}{BOOK_02};{PageStart_04};{PageEnd_04}
            • {YEAR_2}→二碼年份、不補零;{YEAR_03}→三碼年份、補零。
            • {VOL_02}→二碼卷次、補零;{VOL_03}→三碼卷次、補零。
            • {BOOK_02}→二碼冊號,補零;可能是00;如果是上、中、下冊,則分別為01, 02, 03。
            • {PageStart_04}→起始頁次,四碼補零。
            • {PageEnd_04}→結束頁次,四碼補零。
            另外需注意的是,即使文字中沒有顯示冊號,網址中仍可能會有。例如0990311的委員會審查99卷15期3780號 184~199頁


            關係文書

            連向「立法院議案關係文書」的PDF檔(內容是掃瞄圖)。除了早年沒有存檔(或是沒有掃描)之外,大抵是:

            • 每次一讀必有一份,即一份提案文件;
            • 進入二讀時至多一份,即委員會統整的意見說明。

            文字部分是另一種(不知名的)立法院文書的頁次起訖,注意連接符號是 '-' 而不是 '~' ,且沒有「頁」字。


            網址格式:http://lis.ly.gov.tw/lgcgi/lgmeetimage?{HEXES}
            關於問號後面的字串,我看過兩種長度,而且"cfc"這個子字串似乎很容易出現,但沒有琢磨出究竟代表甚麼。

            法條沿革

            • {Format_A} →  "NO=E{lyID}* OR NO=B{lyID}"
            • {Format_B} →  "10$$$NO-PD"
            依法條順序顯示各個法條的歷次版本,會列出理由。
            除了「全文修正」的情形外,只會列出有修改內容的日期與版本。換言之,不能只看其中一條就判斷該法到底修過幾次。

            修正沿革

            • {Format_A} →  "NO=E{lyID}* OR NO=B{lyID}"
            • {Format_B} →  "11$$$PD+NO"
            依日期先後顯示該次三讀過後有修改過的條文。亦即「制定」及「全文修正」時才會把全文列出。
            亦會列出理由。


            錯誤彙整

            有些資料並不如前述所說的那麼令人預期,而要另外例外處理:
            • 興辦水利事業獎勵條例的「歷次法版本」中,在廢止的三讀日有連結(但不應有),而該連結對象是不存在的。
            • 國立甘肅科學教育館組織條例有三次三讀日,分別是制定、停止適用、廢止,其中:
              • 「停止適用」的日期沒有被放上連結(確實不該有),但是卻存在相應的檔案
              • 前述相應的檔案中,有「立法紀錄」的連結,但是該連結對象是不存在的。
              • 「廢止」的日期有連結(但不應有),該連結對象是不存在的。
            • 外交部特派員公署組織條例的各個「歷次法版本」靜態網頁都沒有顯示法律名稱。
            • 內政部組織法在38年5月6日的版本中,第十條內文開頭缺少兩個全形空白。


            結論

            (花了一個禮拜終於寫到這裡了。)
            如前所述,其實只需要「法條沿革」和「修正沿革」這兩頁就可以取得歷次修法結果與修法理由。但是這兩頁缺少的資訊有:
            • 法律名稱的變化
            • 多個條文的分區(編章節款目)
            • 「公告」和「施行」
            • 「廢止」和「停止適用」

            「全文」頁面的特有資訊則是法條的「標題」,還有「相關條文」。其中「相關條文」有助於做出不需資料庫伺服器的瀏覽器外掛。

            另外也可以考慮利用「分類瀏覽」,幫各個法律多加個tag。各分類的網址格式為:
            http://lis.ly.gov.tw/lgcgi/lglaw?@{Weird}:1804289383:g:CN={Category_04}* AND NO=A1$$1__
            其中 {Category_04} 是四碼、十進位、補零,不過各分類的編號好像都在一千以下。由於有些分類超過一百筆,也就有「下一頁」不是hyperlink的問題,因而仍然難以快速地列出所有法律。

            待寫

            • 資料儲存格式與資料庫
            • 全國法規資料庫
            • 司法院
              • 裁判書檢索
              • 函釋檢索
            • 法源法律網
            • 評律網

            1 則留言:

            TLC不是Friday!! 提到...

            我覺得這個擴充功能對念法律的人而言真是太實用了,謝謝!