上一篇「在WSH環境如何應用DOM方式分析網頁資料」文章中卡在JavaScript語法無法執行的問題,終於~~在幾翻嘗試後,找到解決的方法了。方向就如同這篇「How can I automatically ignore script error parsing JScript?」所提的方式,針對window.onerror事件來處理,只是目前的作法上看起來有點怪。
有關window.onerror事件的說明與作法,可以參考「The onerror event of the window object」裡頭的教學說明,寫的很詳細。底下就是調整後的程式碼:
<?xml version="1.0" standalone="yes" encoding="big5"?>
<package>
<job>
<script type="text/javascript" language="javascript" charset="utf-8">
<![CDATA[
/**
*
* 取得資料。
*
* @author ace
*
* @version 2010/11/11 v0.1
*
* @param {String} astrStockCode 股票代碼。
*
* @returns {String} 網頁資料。
*
* @requires Microsoft.XMLHttp
*
*/
function getHttp(astrStockCode) {
var strReturn = new String("");
var strURL = new String("http://tw.stock.yahoo.com/q/q?s=" + astrStockCode);
var objXMLHttp = new ActiveXObject("Microsoft.XMLHttp");
objXMLHttp.open("GET", strURL, false, "");
objXMLHttp.send();
// todo: 加入是否正確取得資料之判斷式。
var strReturn = new String(objXMLHttp.responseText);
return strReturn;
}
/**
*
* 剖析html資料。
*
* @author ace
*
* @version 2010/11/11 v0.1
*
* @param {String} astrTrnDate 交易日期。
* @param {String} astrStockCode 股票代碼。
*
* @returns {Array} 陣列資料。
*
*/
function parseHTML(astrTrnDate, astrStockCode, astrContent) {
var objReturn = new Array();
/**
*
* 建立瀏覽器物件。
*
* @author ace
*
* @version 2010/11/16 v0.1
*
* @see <a href="http://us.generation-nt.com/answer/parsing-html-jscript-help-59686112.html">Parsing HTML with JScript</a>
* @see <a href="http://www.eggheadcafe.com/software/aspnet/36239301/jquery.aspx">Jquery</a>
*
*/
var htmlfile = new ActiveXObject("htmlfile");
var window = htmlfile.parentWindow;
var navigator = window.navigator;
var document = window.document;
var location = document.location;
window.ActiveXObject = {};
// todo:載入html檔案發生錯誤時,無法被JavaScript的catch語法攔截?!
htmlfile.open();
htmlfile.write("<script type=\"text/javascript\">window.onerror = function () {};</script>");
htmlfile.write(astrContent);
htmlfile.close();
var objTR = document.getElementsByTagName("tr");
for (var intIndex = 0; intIndex < objTR.length; intIndex++) {
var objTD = objTR[intIndex].getElementsByTagName("td");
if (objTD.length == 12) {
objReturn.push(astrTrnDate);
objReturn.push(astrStockCode);
objReturn.push(objTD[2].firstChild.innerHTML); // 成交金額多了<b>標籤,再往下一個結點取資料。
objReturn.push(objTD[3].innerHTML);
objReturn.push(objTD[4].innerHTML);
objReturn.push(objTD[6].innerHTML.replace(",", ""));
objReturn.push(objTD[7].innerHTML);
objReturn.push(objTD[8].innerHTML);
objReturn.push(objTD[9].innerHTML);
objReturn.push(objTD[10].innerHTML);
break;
}
}
return objReturn;
}
// Program Start Here
try {
var objToday = new Date();
// 以系統日期當作交易日期,理想作法應以網頁記載時間為準。
var strTrnDate = new String("");
strTrnDate = objToday.getFullYear().toString() + (objToday.getMonth() + 1).toString() + objToday.getDate().toString();
var strStockCode = new String("2002");
var objResult = parseHTML(strTrnDate, strStockCode, getHttp(strStockCode));
if (objResult.length != 0) {
WScript.Echo("交易日期:" + objResult[0]);
WScript.Echo("股票代碼:" + objResult[1]);
WScript.Echo("成交價格:" + objResult[2]);
WScript.Echo("買進價格:" + objResult[3]);
WScript.Echo("賣出價格:" + objResult[4]);
WScript.Echo("成交張數:" + objResult[5]);
WScript.Echo("昨日收盤:" + objResult[6]);
WScript.Echo("開盤價格:" + objResult[7]);
WScript.Echo("最高價格:" + objResult[8]);
WScript.Echo("最低價格:" + objResult[9]);
}
}
catch (e) {
WScript.Echo("執行過程有誤,錯誤訊息:" + e.description);
}
]]>
</script>
</job>
</package>
主要就是增加78這一行,用來忽略網頁執行錯誤時引發除錯訊息而造成程式無法接續執行。只是若就整體程式來看,window.onerror事件處理函數擺置的位置是在未載入網頁之前,作法不太正統,只是若就目前這個問題來看,算是解決了(當網頁來源改變時,不知道經不經得起考驗XD)。
用DOM(Document Object Model)架構來剖析網頁節點資料,看來是比純用字串剖析來的清楚些。只是以WSH(Windows Script Host)環境建立ActiveXObject("htmlfile")物件的方式還是第一次嘗試,還要再多測試才能驗證這樣的搭配是否真的可以用來剖析網頁資料。
沒有留言:
張貼留言