2010年12月5日 星期日

在WSH環境如何應用jQuery分析網頁資料

在「在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資料庫或閱讀器!?
雖然結果不是如一開始預期的好,但也藉機了解一下jQuery套件的運作模式,也不能說沒有收穫。有時間再好好看一下jQuery套件的功能,或許可以得到更好的應用方式XD

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...