在「在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資料庫或閱讀器!?
沒有留言:
張貼留言