在「在WSH環境如何應用DOM方式分析網頁資料─解決JavaScript語法無法執行問題」這篇文章中,主要是應用JavaScript+DOM的方式進行網頁資料剖析。其中參考的「Jquery」這篇文章提到原本用意是要執行jQuery套件,這倒讓我挺有興趣,如果改用jQuery套件來分析網頁資料應該會更有效率吧?
首先需要確定的是jQuery是否可以在WSH(Windows Script Host)環境下執行,這個問題在看到這篇「jQuery on WSH テスト」後就不需要自己驗證了,作者直接使用jQuery套件取RSS資料回來進行資料剖析,連程式碼都有提供。
既然如此,就來試試唄,改以jQuery套件剖析網頁的完整程式碼如下:
<?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/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 = {};
]]>
</script>
<script src="js/jquery/jquery-1.2.6.js" type="text/javascript" language="javascript" charset="utf-8"></script>
<script type="text/javascript" language="javascript" charset="utf-8">
<![CDATA[
/**
*
* 使用jQuery剖析網頁資料。
*
* @author ace
*
* @version 2010/12/03 v0.1
*
* @param {String} astrTrnDate 交易日期。
* @param {String} astrStockCode 股票代碼。
*
* @returns {Array} 陣列資料。
*
*/
function parseHTML(astrTrnDate, astrStockCode) {
var objReturn = new Array();
var strURL = new String("http://tw.stock.yahoo.com/q/q?s=2002");
var $ = window.$;
(function(strURL){
$.ajax({
type: "GET",
url: strURL,
dataType: "html",
async: false,
success: function(html) {
// 取回的html資料必須先填入htmlfile內才可以進行後續jQuery的處理?
// 若依http://forum.jquery.com/topic/how-to-parse-ajax-html-response這篇文章的回覆,應該只要建立jQuery物件即可處理。
htmlfile.open();
htmlfile.write(html);
htmlfile.close();
$(document).find("tr").each(
function() {
var objTD = $(this).find("td");
if (objTD.length == 12) {
objReturn.push(astrTrnDate);
objReturn.push(astrStockCode);
objReturn.push(objTD.eq(2).text());
objReturn.push(objTD.eq(3).text());
objReturn.push(objTD.eq(4).text());
objReturn.push(objTD.eq(6).text());
objReturn.push(objTD.eq(7).text());
objReturn.push(objTD.eq(8).text());
objReturn.push(objTD.eq(9).text());
objReturn.push(objTD.eq(10).text());
}
}
);
},
error: function(){
WScript.Echo("Error at $.ajax");
}
});
})(strURL);
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);
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>
對照純粹使用JavaScript+DOM語法剖析網頁的方式,好像沒啥差別‧‧‧感覺不出特別有效率的地方(指的是可以更簡潔的取得指定標籤)。可能是太異想天開了,拿關刀展小雞‧‧‧>"<(也或許舉這個例子是錯誤的?)
在這個測試過程中,遇到不少麻煩(可能是jQuery套件不夠熟吧),將遇到的狀況條列如下:
- 雖然在WSH(Windows Script Host)架構下建立window物件提供jQuery套件使用,但在載入jQuery套件的v1.3後續版本都無法執行。測試期間嘗試使用v1.3.2與v1.4.4的版本,都各別產生不同的錯誤訊息而無法載入。這部份原因還沒去查,只能暫時先記錄下來。
- 依照「How to parse Ajax HTML response?」這篇文章的回覆,理應可以將取回的html字串直接轉換成jQuery物件進行資料剖析,無奈卻一直無法取得標籤資料,不知是取得資料的差異或環境不同造成的結果。最後採用將資料寫入htmlfile物件後,才順利取得網頁相關標籤內的資料。jQuery套件的用法還不夠熟,還看不出可以改進的方法,一併記錄下來。
- 在「jQuery on WSH テスト」這篇文章中,作者的目的是取得RSS資料,因此dataType指定為xml。當jQuery取回資料後,可以typeof判斷得知其為Object物件資料型態。而在這個例子中,dataType為html,若使用typeof判斷則為string資料型態,所以該文所舉的方式並不能完整套用在這個例子中。不過該文所舉的例子倒是可以考慮用來製作RSS資料庫或閱讀器!?
沒有留言:
張貼留言