今日政府電子採購標案資料(搜尋)
在Perl環境下,先使用windows console執行:
Perl PCCTDParser.pl http://web.pcc.gov.tw/pishtml/todaytender.html > DAT.js
再開啟index.html網頁。(總共會三個檔案會在同個目錄)
網頁使用的Javascript: 1.AngularJS (主要在搜尋功能) 2.JQuery (樣式功能)
今日政府電子採購標案資料(搜尋)
在Perl環境下,先使用windows console執行:
Perl PCCTDParser.pl http://web.pcc.gov.tw/pishtml/todaytender.html > DAT.js
再開啟index.html網頁。(總共會三個檔案會在同個目錄)
網頁使用的Javascript: 1.AngularJS (主要在搜尋功能) 2.JQuery (樣式功能)
<!DOCTYPE html> | |
<html ng-app> | |
<head> | |
<title>今日政府電子採購標案搜尋</title> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
<script src="http://code.angularjs.org/1.2.4/angular.min.js"></script> | |
<script src="DAT.js"></script> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> | |
</head> | |
<!--使用元件 | |
1.AngularJS | |
2.JQuery | |
--> | |
<!-- 研究問題 | |
1.使用table比較沒問題,但聽說未來的HTML將不再支持 | |
2.使用div呈現Table,JQuery無法正確select元素,儘管宣告Class和ID | |
3.使用ul、li呈現,不支持百分比寬度和高度,改變瀏覽器視窗大小(手機瀏覽)可能發生排版紊亂問題 | |
--> | |
<body> | |
<div style="font-size: 36px; text-align: center; font-weight: bold; margin-bottom:30px; ">今日政府電子採購標案資料</div> | |
<!--打字的地方--> | |
<span style="font-size:20px; ">搜尋標案:</span> | |
<input style="font-size:18px; width:50%; " placeholder="在這裡打字自動搜尋標案" type="text" ng-model="search" onkeyup="ABC()"> | |
<div id="TDNow">今天是:</div> | |
<div style="text-align:right; "><a href="http://web.pcc.gov.tw/pishtml/todaytender.html" target="_blank">今日所有標案原始網頁</a></div> | |
<div style="text-align:right; "><a href="http://web.pcc.gov.tw/tps/pss/tender.do?method=goSearch&searchMode=common&searchType=basic" target="_blank">查詢過往公開標案</a></div> | |
<!--呈現資料的地方--> | |
<div ng-controller="tableData"> | |
<table border="1" id="searchTextResults" width="100%" style="border-collapse: collapse; border-color: black;" border="1"> | |
<!--表格欄位標題--> | |
<tr style="font-weight:bolder; "> | |
<td width="11%" style="text-align:center; ">標案分類</td> | |
<td width="25%" style="padding-left:10px; padding-right:10px; ">廠商</td> | |
<td width="50%" style="padding-left:10px; padding-right:10px; ">標案名稱</td> | |
<td width="6%" style="text-align:center; ">連結</td> | |
<td width="8%" style="text-align:center; ">截止投標日</td> | |
</tr> | |
<!--表格內容--> | |
<tr style="height:35px; " ng-repeat="fact in class | filter:search"> | |
<td width="11%" style="text-align:center; ">{{fact.mch}}</td> | |
<td width="25%" style="padding-left:10px; padding-right:10px; ">{{fact.factor}}</td> | |
<td width="50%" style="padding-left:10px; padding-right:10px; ">{{fact.tname}}</td> | |
<td width="6%" style="text-align:center; "><a href="{{fact.rlink}}" target="_blank">點我</a></td> | |
<td width="8%" style="text-align:center; ">{{fact.edate}}</td> | |
</tr> | |
</table> | |
</div> | |
<!--表格結尾提示訊息--> | |
<div style="color:red; font-size:18px; ">原始標案資料網頁沒有「預算金額」資料,查詢時請注意「預算金額」以及「招標狀態是否為第一次」</div> | |
<!--其他的srcipt--> | |
<!--script1:網頁載入後將表格隔列上色--> | |
<script> | |
$(document).ready(function() { | |
$("tr:odd").delay(1500).css("background-color","#CCCCCC"); | |
}); | |
</script> | |
<!--script2:完成輸入並自動搜尋資料後,先將表格漂白再隔列上色--> | |
<script> | |
function ABC() | |
{ | |
$("tr").css("background-color","#FFFFFF"); | |
$("tr:odd").delay(1500).css("background-color","#CCCCCC"); | |
} | |
</script> | |
<!--script3:顯示日期--> | |
<script> | |
var YY = new Date().getFullYear()-1911; | |
var MM = new Date().getMonth()+1; | |
var DD = new Date().getDate(); | |
var WW = new Date().getDay(); | |
var WC = ['日','一','二','三','四','五','六']; | |
$('#TDNow').text("今天是:民國" + YY + "年" + MM + "月" + DD + "日 星期" + WC[WW]); | |
</script> | |
</body> | |
</html> |
#擷取資料:http://web.pcc.gov.tw/pishtml/todaytender.html | |
#其實是有想過要用For迴圈,但分類的資料內容不一樣,檔案結尾的文字處理,一時想不起來要怎麼寫好code | |
use LWP::Simple; | |
use utf8; | |
my $x="var tableData \= function\(\$scope\)\n\{\n\$scope\.class = \[\n"; | |
print $x; | |
my $geData=get($ARGV[0]); | |
my $TT10=$geData; | |
#砍柴:公開招標 | |
foreach ($TT10) { | |
#僅保留label_type1_0中的表格,其餘移除 | |
s{.*label_type1_0"></a>}{}s; | |
s{label_type1_1.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT10 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'公開招標\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT11=$geData; | |
#砍柴:限制性招標 | |
foreach ($TT11) { | |
#僅保留label_type1_1中的表格,其餘移除 | |
s{.*label_type1_1"></a>}{}s; | |
s{label_type1_2.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT11 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'限制性招標\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT12=$geData; | |
#砍柴:選擇性招標(合格廠商) | |
foreach ($TT12) { | |
#僅保留label_type1_2中的表格,其餘移除 | |
s{.*label_type1_2"></a>}{}s; | |
s{label_type1_3.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT12 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'選擇性招標1\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT13=$geData; | |
#砍柴:選擇性招標(個案) | |
foreach ($TT13) { | |
#僅保留label_type1_3中的表格,其餘移除 | |
s{.*label_type1_3"></a>}{}s; | |
s{label_type1_4.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT13 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'選擇性招標2\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT14=$geData; | |
#砍柴:選擇性招標(後續邀標) | |
foreach ($TT14) { | |
#僅保留label_type1_4中的表格,其餘移除 | |
s{.*label_type1_4"></a>}{}s; | |
s{label_type1_5.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT14 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'選擇性招標3\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT15=$geData; | |
#砍柴:取得報價單、企劃書 | |
foreach ($TT15) { | |
#僅保留label_type1_5中的表格,其餘移除 | |
s{.*label_type1_5"></a>}{}s; | |
s{label_type2_0.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT15 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'報價單與企劃書\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT20=$geData; | |
#砍柴:公開招標(更正) | |
foreach ($TT20) { | |
#僅保留label_type2_0中的表格,其餘移除 | |
s{.*label_type2_0"></a>}{}s; | |
s{label_type2_1.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT20 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)公開招標\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT21=$geData; | |
#砍柴:限制性招標(更正) | |
foreach ($TT21) { | |
#僅保留label_type2_1中的表格,其餘移除 | |
s{.*label_type2_1"></a>}{}s; | |
s{label_type2_2.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT21 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)限制性招標\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT22=$geData; | |
#砍柴:選擇性招標1(更正) | |
foreach ($TT22) { | |
#僅保留label_type2_2中的表格,其餘移除 | |
s{.*label_type2_2"></a>}{}s; | |
s{label_type2_3.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT22 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)選擇性招標1\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT23=$geData; | |
#砍柴:選擇性招標2(更正) | |
foreach ($TT23) { | |
#僅保留label_type2_3中的表格,其餘移除 | |
s{.*label_type2_3"></a>}{}s; | |
s{label_type2_4.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT23 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)選擇性招標2\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT24=$geData; | |
#砍柴:選擇性招標3(更正) | |
foreach ($TT24) { | |
#僅保留label_type2_4中的表格,其餘移除 | |
s{.*label_type2_4"></a>}{}s; | |
s{label_type2_5.*}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT24 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)選擇性招標3\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元 | |
s{,\s<tr.*}{,\n}s; | |
print; | |
} | |
my $TT25=$geData; | |
#砍柴:報價單與企劃書(更正) | |
foreach ($TT25) { | |
#僅保留label_type2_5中的表格,其餘移除 | |
s{.*label_type2_5"></a>}{}s; | |
s{.*</th>\s+</tr>\s+}{}s; | |
#無後續表格,此程式碼移除並更改新增移除內容 | |
s{</TABLE>.*}{AAAAAA}s; | |
#檢查標案是否有符號字元,例如"(雙引號)必須轉成"成為網頁顯示並非語法字元 | |
s{\"}{\"\;}g; | |
#判斷是否無公告資料 | |
if ($TT25 =~ /.*無公告資料.*/s){ last }; | |
#將所有屬性標籤轉成json格式 | |
s{<tr>\s+<td.*\s+.*black>}{ \{mch\: \'(更正)報價單與企劃書\', factor\: \'}g; | |
s{</font></td>\s+<td\s><font\scolor\=black>}{\', tname\: \'}g; | |
s{</font></td>\s+<td.*href\=\"\;}{\', rlink\: \'http\:\/\/web\.pcc\.gov\.tw}g; | |
s{\"\;.*</a></font></td>\s+<td.*black>}{\', edate\: \'}g; | |
s{</font></td>\s+</tr>\s+}{\'\},\n}g; | |
#移除行尾多餘字元,唯獨此程式碼後面增加一個大誇號尾巴 | |
s{'\},\sAAAAAA}{'\}\]\n\}}s; | |
print; | |
} | |
#其實最後面有一個小BUG(最後一項無公告資料時就會發生),這裡先暫時假設每天都會有資料 |