LV. 36
GP 2k

【閒聊】養成機器人教學(Day 5) 父與子,老葉與嫩葉

樓主 敵會跪 jack12345520
GP2 BP-
前言

在前一篇  我們花了落落長的篇幅
介紹了Dom tree
我們也用兩種方法打開觀看Dom tree的視窗

因為我們要爬資料的是勇者小屋
所以我們可以進到自己/別人的勇者小屋
然後觀看Dom tree

打開小屋吧!




雖然看起來很複雜
但其實我們只要三個數據而已
帳號、暱稱、稱號
這些區塊之間的關係
我們可以用親屬間的關係來看
英文稱謂的部分  會攸關到我們之後取用的方法




                        (圖片取自暴走漫畫 經本人修改)



因為只要那幾個簡單的資料
我們只要看這一小塊區塊就好





開始爬小屋的資料

所以我們目的是取到MSG-mydata1包起來的資料
但在此之前
我們需要先經過Xml的轉換
把HTML轉成Xml的形式  才能解析出

在xml_parsing() 函式
我們將senderId 傳進來(也就是發訊息的你)
機器人用了UrlDetchApp這個方法
去你的小屋去抓資料
var fetch =  UrlFetchApp.fetch("https://home.gamer.com.tw/homeindex.php?
                  owner=" + senderId);


然後經過Xml解析之後
傳回了一個根目錄的資料
var root = doc_parse.getRootElement();
為了方便理解  
你可以把它看成一整個網站Dom tree的資料都在裡面



var MSG = getElementsByClassName(root,"MSG-mydata1")[0];
接下來get_info是為了從剛剛那個root
取得MSG-mydata1包起來的資料
我們用getElementsByClassName這個方法
取得class叫做MSG-mydata1的資料


有看到它的英文是Elements嗎?
因為這個方法可能會取到很多class叫做MSG-mydata1的區塊
所以我們要選擇第一個(也就是陣列索引0)



var MSG_li = getElementsByTagName(MSG,"li");
我們再從這個MSG-mydata1取資料
總之就是一步步拆解
利用getElementsByTagName 取<li>這個標籤的元素
和先前一樣   會取得多個<li>標籤的元素


我們再利用
迴圈逐個把MSG_li裏頭的文字取出來
由於有的<li>標籤裡頭有包span  有的沒有
所以要另外做判斷




這一步完其實差不多了
稱號對應稱號、暱稱對應暱稱 的資料
但是稱號取回來的資料包含「稱號:」
所以需要另外字串處理
obj["稱號"] = obj["稱號"].slice(3);


最後我們回到doPost()這個指令碼
xml_parsing() 先藉由我們的ID 取解析小屋的資料
再用get_info 一步步拆解 取需要的資料
botReply()再回覆我們




總結

大致的流程會像這樣子
getChild(),getChildText()這些
是GAS裡元素取值、資料的方法
詳情可進這個指南參考




另外 我們用的Xml_parsing方法
如果有在編譯做測試的你  是否發現什麼問題呢?
怎麼右上角都會有警告視窗呢?
沒錯   因為方法已經過期  被Google棄用了(Deprecated)
但是目前找不到其他方式解決   只能先這樣


那麼老樣子  請期待第六篇
2
-
未登入的勇者,要加入 2 樓的討論嗎?
板務人員:

0 筆精華,吸收日月精華中
一個月內新增 0
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】