一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VBA IE對象的操作方法

 本明書館 2015-01-13
我們在實際工作中遇到網(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)
以下代碼
在VBA環(huán)境下進行試驗——我不在意你是用WORD還是EXCEL——可以先做一行過程模塊,也可以在立即窗口下逐行輸入:

Set ieA = CreateObject("InternetExplorer.Application")  ‘創(chuàng)建對象
ieA.Visible = True   ‘使IE頁面可見,做完這一步,在VBA之外可以看到一個新的IE
ieA.navigate "about:blank"   ‘空白頁
這幾行代碼的作用是創(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應用程序
注:WEB BROWSE控件和單獨的IE程序并不是完全相同的,例如WEB控件不能用QUIT方法退出,IE的NAVIGETE方法沒有復雜的POST參數(shù),但文檔對象都可以用同樣的方法引用,大部分事件和方法也通用
另外,如果訪問一個已經(jīng)存在的網(wǎng)頁,例如
WWW.EXCELHOME.NET,因為可能產(chǎn)生異步的延時,所以如果不是立即窗口,往往根據(jù)READYSTATE的狀態(tài)保證網(wǎng)頁加載完畢:
SUB LOADIE()   ‘ 在代碼的常見的處理情況
Set ieA = CreateObject("InternetExplorer.Application")
ieA.Visible = True
ieA.navigate "WWW.OOXX.COM ‘←打開某個網(wǎng)頁,要一定時間,但代碼會往下執(zhí)行
DO UNTIL ieA.Readystate=4   ‘  檢查網(wǎng)頁是否加載完畢(4表示完全加載)
   DOEVENTS                ‘ 循環(huán)中交回工作權(quán)限給系統(tǒng),以免“軟死機”
LOOP 
END SUB
如果對這個IE應用程序?qū)ο蟮南嚓P(guān)聲明和事件感興趣,就要引用IE控件找到對象中的常量和事件:SHDOCVW.DLL(MICROSOFT INTERNET CONTROL)
你可以看到的是,通過ieA——就是創(chuàng)建的對象——我們可以操作它,也可以訪問它的屬性。下面繼續(xù),如果前面你是在命令行輸入,打開的那個空白網(wǎng)頁沒有關(guān)閉,變量是繼續(xù)有效的:
Set doc = ieA.Document     ‘取得網(wǎng)頁的文檔對象
doc.body.innerHTML = "Hello"   ‘在文檔的BODY標記內(nèi)加上標記文字HELLO
網(wǎng)頁上寫了一行小字,HELLO......通用的慣例,當然你可以寫上其它的什么,HI,我愛你,EXCEL,HOME之類,但這不是最需要的關(guān)心的問題,我們要知道這個對象之下的結(jié)構(gòu)。
從文檔對象(Document)以下展開的對象模型,它代表網(wǎng)頁的內(nèi)容,和前面那個IE的應用程序不是同一個體系——請注意這一點——如果我們編程時要用到對應的對象事件和常量,在VB/VBA中要引用的類型庫是MSHTML.TLB(MIRCOSOFT HTML OBJECT LIBRARY)
Documnet(文檔)是文檔對象模型的基礎(chǔ),相當于OFFICE對象中的APPLICATION,取得Document之后,不論修改網(wǎng)頁還是讀寫網(wǎng)頁,還是觸發(fā)事件,一切都好說,每個URL都對應有一個Documnet(這是假如定成功導航Navigate到那個URL完成,因此之前要求確定IE對象READSTATE,以確定對應URL的Document打開了)
在Documnet之下可以取得documentElement和body兩個節(jié)點:
......              ‘前面已經(jīng)取得了ieA對象,并打開空白網(wǎng)頁,不再重復
set doc=ieA.Document
set xbody=doc.Body   ‘取得body對象
set xDoc=doc. documentElement  ‘取得根節(jié)點
body前面已經(jīng)說過,相當于
標記的對象,根節(jié)點相當于網(wǎng)頁中的標記元素的對象,MHTML的類型庫定義里,它們都屬于HTMLHtmlElement類型的對象,下面我把這種類型的對象稱為一個“節(jié)點”,不過要注意的是文檔對象不是節(jié)點對象,它是HTMLDocument類型。根節(jié)點和body節(jié)點不同的是根節(jié)點包括整個網(wǎng)頁,在HTML的文檔對象模型中,這類對象有幾種屬性可以取得其中的內(nèi)容:
對象.innerHtml   ‘對象內(nèi)部的HTML文本
對象.OuterHtml   ‘對象中的HTML文本,包括對象本身的HTML標記在內(nèi)
對象.innerText    ‘對象內(nèi)部的TEXT,不包括HTML標記
對象.OuterText    ‘同上,包括對象本身的文本
所以,如果我們要抓取某個網(wǎng)站的所有HTML內(nèi)容,代碼可以這樣寫:
......              ‘前面已經(jīng)取得了ieA對象,并打開某URL網(wǎng)頁
set doc=ieA.Document
set xDoc=doc. documentElement  ‘取得根節(jié)點
strX=xDoc.OuterHtml    ‘取得所有的HTML內(nèi)容
這種取值的方式不妨可以當成EXCEL的單元格取值:
set shDocX=APPLICATION.ACTIVEWORK.ACTIVESHEET  ‘從應用程序、工作簿一直定位到當前工作表,這是EXCEL的工作簿對象模型
set rngX=shDocX.Rang(“a1”)   ‘取得單元格(其實不一定是一個格子,只要是RANGE類型對象即可)
X=rngX.VALUE    ‘取得VALUE值,也可以取只讀的TEXT
在網(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集合——不過我們很直觀地可以看到,它們的下級集合是空的。
用程序代碼程序問的過程是怎么樣的呢?這種“目錄式”層次的方式似乎是很有序的,那么,把上面的內(nèi)容另存為一個HTML文檔,放到硬盤的某個目錄下,自已寫一段代碼做完前面的工作吧,我不代勞了:
…….假定你已經(jīng)用ieA為名的對象瀏覽了上述網(wǎng)頁文件
set doc=ieA.Document
set xbody=doc. body   ‘取得body節(jié)點
set xI00= xbody.Childnodes.item(0)  ‘取得body的第1個節(jié)點
set xI01=xbody.Childnodes.item(0)  ‘取得bdoy的第2個節(jié)點
Msgbox xI00.innerText   ‘顯示第1個節(jié)點(DIV)的文本
Msgbox xI01.outerHtml   ‘顯示第2個節(jié)點(P)的完整內(nèi)容
在VB/VBA/VBS系列的語言中,item是默認方法,可以省略,不過我在這里還是寫出來,加深印象。
應該注意的是,文檔對象模型中,集合與OFFICE的集合有所不同,首先,集合是從0開始計數(shù)的,習慣了OFFICE VBA編程的朋友們一定要注意,不同的對象架構(gòu)有不同的方式,這里用的是“0集合”,其次,它用的計數(shù)屬性是Length而不是Count,不要習慣性地打上Childnode.Count查看集合的數(shù)量了
除了ChildNodes集合,大家在網(wǎng)頁文檔對象中還常見到的就是很大氣的一種集合:All集合,這是“最糊涂”的一種集合,文檔和各級節(jié)點都帶有這個集合,正如這個名字所示,它是不分層次的,但用起來也很方便:
…….
Set doc=ieA.Document
Set xCols=doc.All   ;取得文檔中的所有節(jié)點集合
Set xbCols=doc.body.All ;取得body節(jié)點下所有的節(jié)點集合
雖然任何標記節(jié)點都有ALL集合,但我們還是喜歡用DOCUMENT的ALL,原因無它,文檔最大,一鍋燴的ALL找起來也最合適。
ALL查找是有條件的:如果這個標記沒有ID,你無法查到它的名字:

hi,you

excel

set tag1=doc.All.item(“myTag”).item(0)   ‘返回標記內(nèi)部ID=myTag的集合并取第一個
最初在我個人看來,如果網(wǎng)頁中的HTML標記已經(jīng)有了ID,不如用文檔對象的getElementById直接返回一個對象更直接,這個方法不需要經(jīng)過集合:
set tag1=doc. getElementById(“myTag”)  ‘返回第一個內(nèi)部標有ID=myTag的標記
不過,ALL集合有一個很方便的特性——至少在初學者看來是很好用的:ID可以掛到ALL集合之下:
strX=doc.All.mytag.innerhtml     ‘嗚嗚嗚,太好用了
另一種方法是以標記名為集合,要用到文檔對象的getElementsByName方法:
set mydivs=doc. getElementsByName(“div”)   ‘取得所有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標記
Set frmX=myForms.item(0)  ‘第1個FORM
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:
QUOTE:
frmX.submit   ‘是的,只要Submit,相當于用戶在頁面上按下FORM的發(fā)送按鍵

但它的參數(shù),也就是INPUT標記們怎么辦?當然你可以自已修改,訪問,唔......如果你分析了已經(jīng)存在的網(wǎng)頁,想從一個空白頁面(ABOUT:BLANK)用VBA“憑空”生成FORM和INPUT節(jié)點,光憑上面的方法還不夠,我們還要“創(chuàng)造節(jié)點”(createElement_x)并連入文檔對應的位置(appendChild),但這已經(jīng)是另一個問題了

 

來源:http://www./show.aspx?id=4066

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产又粗又猛又爽又黄的文字| 日韩精品视频一二三区| 超碰在线免费公开中国黄片| 日韩中文字幕免费在线视频| 翘臀少妇成人一区二区| 日本黄色美女日本黄色| 亚洲av熟女一区二区三区蜜桃 | 日韩精品毛片视频免费看| 国产日韩欧美专区一区| 亚洲熟女少妇精品一区二区三区| 日韩欧美一区二区不卡看片| 91人妻人人精品人人爽| 亚洲美女国产精品久久| 精品国产品国语在线不卡| 国语对白刺激高潮在线视频| 国产精品久久精品国产| 可以在线看的欧美黄片| 国产丝袜女优一区二区三区| av免费视屏在线观看| 欧美一区二区在线日韩| 中文文精品字幕一区二区| 亚洲国产日韩欧美三级| 99久久精品视频一区二区| 大香伊蕉欧美一区二区三区| 粉嫩国产一区二区三区在线| 国产在线成人免费高清观看av| 亚洲熟妇中文字幕五十路| 久久永久免费一区二区| 国产又粗又爽又猛又黄的| 三级高清有码在线观看| 国产精品视频一区麻豆专区| 男生和女生哪个更好色| 国产av乱了乱了一区二区三区| 厕所偷拍一区二区三区视频| 亚洲伊人久久精品国产| 免费啪视频免费欧美亚洲 | 国产午夜福利在线免费观看| 国产精品视频一级香蕉| 精品女同一区二区三区| 亚洲欧美日韩国产成人| 亚洲专区中文字幕在线|