我們在實際工作中遇到網(wǎng)站和網(wǎng)頁相關(guān)往往要涉及到這類問題:如何下載網(wǎng)頁數(shù)據(jù)?網(wǎng)頁之間的通訊是怎么實現(xiàn)的、它們能不能被控制等等。分析網(wǎng)頁根據(jù)不同協(xié)變色鏡可以用不同的角度去看,如數(shù)據(jù)流、標記,不過,如果你是用VB/VBA/腳本或其它支持自動化對象(AUTOMATION)的語言編程,有一個值得了解方法是掌握對象模型,將網(wǎng)頁視為對象來自行控制,這個方法需要了解的是IE的自動化對象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及標準的文檔對象模型(Document) Set ieA = CreateObject("InternetExplorer.Application") 這幾行代碼的作用是創(chuàng)建一個IE應用程序?qū)ο螅ㄊ堑模喈斢谝粋€IE應用程序),并打開一個空白的網(wǎng)頁。這個網(wǎng)頁獨立于VBA的應用程序(WORD或EXCEL)之外,事實上,你必須自已關(guān)掉它,或者用ieA.Quit下令退出——注意一下,單純的關(guān)閉VBA或SET ieA=nothing是不會退出這個網(wǎng)頁的。當然,如果你正在上網(wǎng)并且愿意,在第3行也可以將第3行的字符串替換成一個網(wǎng)站的名字,或者替換成一個你主機中的文檔名——比如C:\XXX.HTM,或D:\PIC\XXX.GIF,正如你在IE地址欄輸入名稱瀏覽這些文檔一樣。另一種可選擇的方法是直接在VB/VBA的窗體或工作表等宿主上增加一個的WEB BROWS 瀏覽器控件,也相當于上面的IE應用程序 SUB LOADIE() 如果對這個IE應用程序?qū)ο蟮南嚓P(guān)聲明和事件感興趣,就要引用IE控件找到對象中的常量和事件:SHDOCVW.DLL(MICROSOFT INTERNET CONTROL) ...... body前面已經(jīng)說過,相當于標記的對象,根節(jié)點相當于網(wǎng)頁中的標記元素的對象,MHTML的類型庫定義里,它們都屬于HTMLHtmlElement類型的對象,下面我把這種類型的對象稱為一個“節(jié)點”,不過要注意的是文檔對象不是節(jié)點對象,它是HTMLDocument類型。根節(jié)點和body節(jié)點不同的是根節(jié)點包括整個網(wǎng)頁,在HTML的文檔對象模型中,這類對象有幾種屬性可以取得其中的內(nèi)容: 對象.innerHtml 對象.OuterHtml 對象.innerText 對象.OuterText 所以,如果我們要抓取某個網(wǎng)站的所有HTML內(nèi)容,代碼可以這樣寫: ...... 這種取值的方式不妨可以當成EXCEL的單元格取值: set shDocX=APPLICATION.ACTIVEWORK.ACTIVESHEET 在網(wǎng)頁上看到的標記,就是根節(jié)點或body之下的標記節(jié)點對象(node)。每一個標記節(jié)點對象之下都有一個名為ChildNodes的集合,它包含了“直屬于本節(jié)點下的標記”,聽起來有點抽象——這么說吧,就象是文件目錄,根目錄下的子目錄…… HELLO
001 在上面的網(wǎng)頁例子里,HTML標記是文檔的根節(jié)點,是Document的Childnodes集合中的一個成員(還是要提請注意,Document不是節(jié)點,是另一種類型對象:上一級文檔,但它可以有下級節(jié)點集合,正如磁盤可以有下級目錄,但它本身不是目錄),BODY是根節(jié)點的ChildNodes集合中的一個成員,而DIV和P兩個節(jié)點則是BODY的ChildNodes集合中的兩個成員,同樣也有自已的Childnoes集合——不過我們很直觀地可以看到,它們的下級集合是空的。 …….假定你已經(jīng)用ieA為名的對象瀏覽了上述網(wǎng)頁文件 在VB/VBA/VBS系列的語言中,item是默認方法,可以省略,不過我在這里還是寫出來,加深印象。 ……. 雖然任何標記節(jié)點都有ALL集合,但我們還是喜歡用DOCUMENT的ALL,原因無它,文檔最大,一鍋燴的ALL找起來也最合適。 hi,you excel
set tag1=doc.All.item(“myTag”).item(0) 最初在我個人看來,如果網(wǎng)頁中的HTML標記已經(jīng)有了ID,不如用文檔對象的getElementById直接返回一個對象更直接,這個方法不需要經(jīng)過集合: set tag1=doc. getElementById(“myTag”) 不過,ALL集合有一個很方便的特性——至少在初學者看來是很好用的:ID可以掛到ALL集合之下: strX=doc.All.mytag.innerhtml 另一種方法是以標記名為集合,要用到文檔對象的getElementsByName方法: set mydivs=doc. getElementsByName(“div”)
(補一小段,特別增加,關(guān)于FORMS,某位兄弟,下面真的真的沒有了,不要期望我上傳實例......)關(guān)于文檔對象的FORMS集合,因為大部分網(wǎng)頁的數(shù)據(jù)提交都是通過FORM標記提交的,因此FORMS集合在沒有網(wǎng)頁中FORM標記沒有ID標記或ID標記重復的情況下,可以用來區(qū)分不同的FORM節(jié)點: QUOTE:
Set
myForms=doc.Forms
FORM標記節(jié)點代表的對象是很多朋友關(guān)心的內(nèi)容——在網(wǎng)頁對象中,它可以發(fā)送數(shù)據(jù)到服務(wù)器,使服務(wù)器刷新網(wǎng)頁(實際上是服務(wù)器按某個格式約定發(fā)回數(shù)據(jù)),我們可以把網(wǎng)頁的FORM看成是一個遠程的函數(shù)調(diào)用接口,F(xiàn)ORM標記中的ACTION指向的URL地址就是函數(shù)入口,而FORM標記內(nèi)的各個INPUT標記節(jié)點就是函數(shù)的參數(shù),當發(fā)出FORM.Submit方法時,就是遠程調(diào)用函數(shù)了,在服務(wù)器端,諸如ASP,PHP就是老老實實找FORM的參數(shù),不管你是用GET還是POST:Set frmX=myForms.item(0) QUOTE:
frmX.submit
但它的參數(shù),也就是INPUT標記們怎么辦?當然你可以自已修改,訪問,唔......如果你分析了已經(jīng)存在的網(wǎng)頁,想從一個空白頁面(ABOUT:BLANK)用VBA“憑空”生成FORM和INPUT節(jié)點,光憑上面的方法還不夠,我們還要“創(chuàng)造節(jié)點”(createElement_x)并連入文檔對應的位置(appendChild),但這已經(jīng)是另一個問題了 |
|