dmt.all.tags('table')
這個(gè)tags也有函數原型
Function tags(tagName) As object
看它的返回值就知道 它也傻,但它只有一個(gè)參數,所以傻不過(guò) dmt.all(xx,yy)
Sheet1.Pictures(2).Left = 0 這句代碼你如果能理解,可以跳過(guò)下面這一段
為了方便理解 先回到工作表界面
新建一個(gè)工作簿 在sheet1上畫(huà)一個(gè)按鈕 然后通過(guò)菜單欄插入隨便 2到3幅圖片
如果想通過(guò)代碼移動(dòng)第二幅圖片到最左邊 常用得寫(xiě)法 有以下4種
[圖片 1].left = 0 或 Evaluate('圖片 1').left = 0 或 Shapes('圖片 1').left = 0
或 Shapes(3).left = 0 (Shapes(1)是先畫(huà)的那個(gè)按鈕 )
但 Pictures(2).Left = 0 也是一樣。 Pictures是隱藏的方法、屬性 表示所有插入的圖片,并可用序號表示單一的圖片
同樣 先畫(huà)上去的“按鈕 1”也可以用 Buttons(1) 來(lái)表示,類(lèi)似的隱藏的方法屬性還有不少,可以通過(guò)對象瀏覽器查看
Picture, Button 就相當于TagName 不過(guò)在網(wǎng)頁(yè)上叫法有點(diǎn)不一樣: FORM IMG INPUT A B DIV FONT TABLE 等等
表達方式 通過(guò)tags 來(lái)引用 dmt.all.tags('INPUT')(0).TEXT = 'ldy' 在第一個(gè)個(gè)輸入框里輸入用戶(hù)名
網(wǎng)頁(yè)的序號從 0 算起 ,這個(gè)跟工作表從1 算起有點(diǎn)不同
Value、Text、innertext、outertext
對象的文字,根據類(lèi)型反映在不同的屬性
如果要填寫(xiě)頁(yè)面,在輸入框里輸入類(lèi)似 11111111
AAAAAA BBBBBBBB 88888888888888 這樣的字
然后再全部分析,再在 分析 表里查找,很容易就能定位那些輸入框的 名稱(chēng),
這樣就能確定到底是用 T.value= 'ldy' 還是用 T.text= 'ldy'
nameProp 通常用來(lái)表示子路徑
sourceIndex 對象在網(wǎng)頁(yè)中唯一序號。
Set T = dmt.all(123)
但用這個(gè)序號固定寫(xiě)入程序里太不靠譜。
每次刷新都可能不同。某些網(wǎng)頁(yè)甚至會(huì )插入不少的空節點(diǎn),來(lái)打亂原來(lái)的序號
(用這種方法來(lái)防止代碼讀取頁(yè)面資料,不過(guò)對于本文讀者來(lái)說(shuō),哈哈哈。。。)
href 對象鏈接的完整路徑。
分析網(wǎng)頁(yè)常用的屬性 也差不多了,還可以用parentElement 取得上級對象 用 children childNodes取得下級對象
dmt.all(xx,yy) 和 dmt.all.tags(tagname)(index) 兩個(gè)語(yǔ)句已經(jīng)能夠從 序號 ID Name 類(lèi)型 4 個(gè)方面分析處理網(wǎng)頁(yè)上的所有對象了
通常在網(wǎng)頁(yè)上取值 也就是 對 Value、Text、innertext、outertext 這4個(gè)屬性取值
用 href 屬性來(lái)獲取鏈接地址
說(shuō)了這么多 那些tagname ID name 如何得到? 對啊 咱還有工具啊
介紹一下咱的小工具
工作原理就是把頁(yè)面上的所有對象都過(guò)一遍,把常用的屬性值顯示在工作表上。
說(shuō)穿了就是把本地窗口中看到的內容節選出來(lái),平面化顯示,便于分析
還可以進(jìn)一步細化 通過(guò)“指定 tags 分析” 可以選擇 只分析 “Table”
還可以 通過(guò)“指定ID、Name分析” 可以選擇 只分析 某個(gè)ID 或 名稱(chēng)
工作表上有ActiveCell, 頁(yè)面上同樣有activeElement 就是被點(diǎn)中(有焦點(diǎn))的的對象 可以通過(guò)“activeElement簡(jiǎn)介” 了解 ID 、Name
序號 和 類(lèi)型(tagname),如果是文本框直接點(diǎn)進(jìn)去就行,但如果是個(gè)按鈕或是個(gè)鏈接,點(diǎn)它的話(huà)會(huì )打開(kāi)鏈接
同時(shí)也就失去焦點(diǎn)了,這里操作上有個(gè)小技巧,不要用左鍵去點(diǎn),用右鍵點(diǎn),對于彈出的右鍵菜單不用理會(huì ),這樣既選中了按鈕,
又不會(huì )打開(kāi)鏈接。這時(shí)再去點(diǎn)擊“activeElement簡(jiǎn)介”按鈕 就會(huì )看到相關(guān)的信息, 這個(gè)對于填寫(xiě)、提交頁(yè)面非常有用
具體操作
在分析表中 點(diǎn)擊按鈕打開(kāi)窗體。
地址欄里是一個(gè) 百度股票行情的地址,就以此為例吧,直接按回車(chē)鍵 ,等頁(yè)面完全打開(kāi)。
點(diǎn) 全部分析 按鈕,大概等幾秒鐘吧,分析表上列出了700多行數據,在看看頁(yè)面上,內容很豐富,但我們想要的就是那張表格里的東西
700多行,那些是我需要的? 用EXCEL的查找功能 按 ctrl+f 調出查找框 輸入 在頁(yè)面表格上看到的任何一個(gè)股票名稱(chēng),然后逐一查找
你會(huì )發(fā)現很多單元格里都有這個(gè) 股票名稱(chēng) ,有些事一大堆文字包含很多無(wú)用信息,有些僅有這一只股票的全部信息,不全
1600301南化股份4.16 4.20 4.15 - 4.58 4.58 10.10% 30102 1365 10.34%
看看它的 tagname --> 是 TR ,VBA的類(lèi)型是 HTMLTableRow,Row ??很熟悉啊 記住了以后有用,再看下一行的 VBA類(lèi)型
是 HTMLTableCell,Cell ?? 這個(gè)更熟悉了。
繼續查找,找到了這個(gè)單元格里有那個(gè)表上的的 列標題和全部?jì)热?,一點(diǎn)多余的東西都沒(méi)有,純的,哈哈就它了。
'序號代碼股票名稱(chēng)昨收盤(pán)今開(kāi)盤(pán)今低 - 今高當前價(jià)漲跌幅成交量金額振幅相關(guān)
1600301南化股份4.16 4.20 4.15 - 4.58 4.58 10.10% 30102 1365 10.34%
2600844丹化科技13.52 13.83 13.72 - 14.87 14.87 9.99% 30357 4340 8.51%
3600543莫高股份8.04 8.04 8.00 - 8.84 8.84 9.96% 40968 3560 10.45%
4600070浙江富潤3.83 3.80 3.80 - 4.21 4.21 9.92% 28934 1179 10.70%
5600452涪陵電力3.94 4.17 4.17 - 4.33 4.33 9.90% 15570 672 4.06%
6600505西昌電力3.44 3.55 3.55 - 3.78 3.78 9.88% 34011 1282 6.69%
7600208新湖中寶3.42 3.49 3.45 - 3.74 3.69 7.89% 314349 11239 8.48%
8600285羚銳股份4.57 4.55 4.46 - 5.03 4.90 7.22% 101748 4889 12.47%
9600088中視傳媒9.85 9.60 9.59 - 10.80 10.44 5.99% 92506 9614 12.28%
10600739遼寧成大13.25 13.20 13.18 - 14.58 14.03 5.89% 301154 43172 10.57%
11600425青松建化5.20 5.22 5.08 - 5.50 5.50 5.77% 22820 1214 8.08%
12600251冠農股份25.23 25.29 25.29 - 27.37 26.62 5.51% 36248 9589 8.24%
13600808馬鋼股份3.90 3.90 3.87 - 4.12 4.11 5.38% 190525 7677 6.41%
14600021上海電力3.55 3.62 3.62 - 3.88 3.74 5.35% 101182 3822 7.32%
15600382廣東明珠4.97 4.97 4.97 - 5.25 5.23 5.23% 34268 1764 5.63% '
看看它的 tagname --> 是 TABLE ,VBA的類(lèi)型是 HTMLTable,Table ??不就是表格的意思嗎,但它的innertext中的數據全都緊貼在一起
如果編個(gè)自定義函數去拆分它,想著(zhù)就頭痛。剛才都'熟悉'兩回了,要是還沒(méi)有點(diǎn)聯(lián)想,唉。。。保重吧…………
現在用指定tags分析,看那網(wǎng)頁(yè)上有多少個(gè) table,點(diǎn)擊“清空分析結果”按鈕,在左邊第一個(gè)列表框里選中table,點(diǎn)擊指定tags分析
按鈕,這次很快,分析表上的2--7 行列出了6個(gè)table的信息中發(fā)現第 5 個(gè)就是所需要的table,在分析表的第6行
這里有一個(gè)簡(jiǎn)單的減法 ,用不著(zhù)從0數下來(lái), 所在行號-2 就是它在 集合里的序號 你要想把這個(gè) table set 到一個(gè) 變量里
就該這樣 set T = dmt.all.tags('table')(4) 這是分析完以后寫(xiě)道程序里的,現在還不用。
看看它的sourceIndex 是286(當前是,過(guò)幾分鐘或下次再打開(kāi)這個(gè)頁(yè)面就不一定是了,所以說(shuō)它 不靠譜,這個(gè)頁(yè)面會(huì )自動(dòng)刷新)
現在要用到“指定序號分析”了,看到這個(gè)按鈕了嗎? 下面有一個(gè)文本框,輸入286 點(diǎn)擊“指定序號分析”
這時(shí) 自動(dòng)切換到的代碼界面,要從本地窗口中看看這個(gè)T 都有什么東西了。
你沒(méi)有本地窗口?? 你一定是初學(xué)者,那你太幸運了,要是我在初學(xué)VBA的時(shí)候能看到這樣一篇文章,估計我現在都會(huì )飛了。
別不好意思,我也是學(xué)VBA半年后才會(huì )在 代碼界面 的 視圖菜單 中找到用 本地窗口 的,又過(guò)了3個(gè)月才明白它的妙處。
本地窗口中 看到一個(gè) T 前面有個(gè)+號,點(diǎn)擊+號展開(kāi)………… 100 多個(gè)屬性,都是按字母順序排列的,先找熟悉的吧,
很快,看到個(gè) cells 屬性,前面也有個(gè)+號,點(diǎn)開(kāi),看到length屬性(相當于VBA中的count)=192,下面跟著(zhù) Item1到 Item192,
前面也都有個(gè)+號 。這個(gè)表 16行 12 列 16*12可不就等于 192,還是要編個(gè)函數去去拆分??
對了,還有個(gè)熟人 row,剛才cell 變cells 那row不會(huì )也變成 rows吧? 果然有個(gè)rows 點(diǎn)開(kāi)+號 length =16 剛好16 行,跟著(zhù)item1-16
點(diǎn)開(kāi)item1的+號,又是100多屬性,再次見(jiàn)到熟人,也有cells 點(diǎn)開(kāi)+號 length = 12 嘿嘿,剛好12列,跟著(zhù)item1-12 再點(diǎn)開(kāi) item1的+號
又是一堆屬性,怎么老是這么多屬性,看吧,……
看到 '序號'了 ,又看到'序號',又看到'序號',好幾個(gè)地方都寫(xiě)著(zhù)'序號',回頭瞄了一眼網(wǎng)頁(yè)上的那個(gè)表,第1行第1列 正是 '序號'
至此 這個(gè)table的中的有用數據是如何存放的 都搞清楚了,其他數據用兩個(gè)循環(huán)嵌套就像在工作表中取值一樣。一串簡(jiǎn)潔高效的代碼出現了
Set dmt = WebBrowser1.Document
Set R = dmt.all.tags('table')(4).Rows
For i = 0 To R.Length - 1
For j = 0 To R(i).Cells.Length - 1
Sheet3.Cells(i + 1, j + 1) = R(i).Cells(j).innerText
Next
Next
我們分析出來(lái)dmt.all.tags('table')(4) 就是所需要的數據,百度是大公司,通常不會(huì )去改變這個(gè)結構。但如果是其他公司的網(wǎng)頁(yè),
可能會(huì )增加廣告、通知什么的,就有可能增加table的數量,今天 dmt.all.tags('table')(4) ,明天4就可能要改成5 或 6
對這種變化較頻繁的頁(yè)面,就要用循環(huán)判斷table的特征來(lái)確定到底是 4 還是 5 或 6 ,這樣可以延長(cháng)代碼的有效期。
像這個(gè)表可以用文字特征來(lái)判斷。
Set dmt = WebBrowser1.Document
for i = 0 to dmt.all.tags('table').length - 1
if instr(dmt.all.tags('table')(i).innertext,'序號代碼股票名稱(chēng)') > 0 then x = i
Next
Set R = dmt.all.tags('table')(x).Rows
For i = 0 To R.Length - 1
For j = 0 To R(i).Cells.Length - 1
Sheet3.Cells(i + 1, j + 1) = R(i).Cells(j).innerText
Next
Next' 在工具文件窗體上有這個(gè)例子
table 是網(wǎng)頁(yè)中的主要元素,幾乎每個(gè)網(wǎng)頁(yè)都有,刷新頁(yè)面總元素數量可能變化,但table的數量一般不會(huì )變。
對于網(wǎng)頁(yè)分析,沒(méi)有任何絕對的東西,上面這段代碼的有效期 取決于百度何時(shí)更改table的特征。比如那天百度瘋了,序號不叫序號
改叫名次,這是漲幅榜叫名次也沒(méi)錯,代碼 給加兩個(gè)字 叫 股票代碼, 股票名稱(chēng) 給減兩個(gè)字 叫名稱(chēng),那我們也只好修改判斷語(yǔ)句了。
最后 注意多Froms的網(wǎng)頁(yè),你需要的數據可能在其中一個(gè)Forms里,通過(guò)Set R = dmt.all(index) 不一定能取到值
這時(shí)需要 Set R = dmt.Forms(2).all(index) 其他的語(yǔ)法方法不變
寫(xiě)這些東西太累,暫時(shí)打住吧,一般的網(wǎng)頁(yè)通過(guò)上述這些方法可以無(wú)障礙的讀取操作了。
老的附件中有一些測試時(shí)的引用,并不起作用,在某些電腦上報錯,下面這個(gè)是修正過(guò)的。
附錄1 不彈出新窗口,在原窗口顯示頁(yè)面
- Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
- Cancel = True
- WebBrowser1.Navigate2 WebBrowser1.Document.activeElement.href
- End Sub
' 直接把WebBrowser的silent設置成true就沒(méi)有腳本錯誤提示了...
WebBrowser1.Silent = True
最近很多壇友問(wèn)起網(wǎng)頁(yè)中框架的問(wèn)題,其實(shí)并不難,簡(jiǎn)單整理如下 關(guān)于多框架頁(yè)面的分析、引用這個(gè)工具是個(gè)單頁(yè)面分析工具,對于嵌套的框架 分析結果以一個(gè) FRAME 對象表示要對框架中的內容操作需要繼續分析,下面是幾個(gè)常用語(yǔ)法
L = WebBrowser1.Document.frames.length '頁(yè)面中有幾個(gè)框架
set dmt1= WebBrowser1.Document.frames(0).Document '取得第一個(gè) 子框架的文檔對象
s = WebBrowser1.Document.frames(0).location '子框架的地址 相當于右鍵 單擊屬性
可以通過(guò)這個(gè)子網(wǎng)址 繼續分析。
分析后的完整引用語(yǔ)法: WebBrowser1.Document.frames(0).Document.all('input').value = 'ldy'2009-7-18 百度的頁(yè)面已調整,Private Sub UserForm_Initialize() 中的語(yǔ)句TextBox40 = 'http://stock.baidu.com/cn/sort_all.php?sh_sz=0&isB=0&order=-10&PageNo=1'
請照此修改
TextBox40 ='http://baidu.hexun.com/stock/sort_all.php?sh_sz=0&isB=0'
[
本帖最后由 ldy 于 2008-12-5 11:01 編輯 ]
[
本帖最后由 ldy 于 2009-6-6 17:31 編輯 ]
[
本帖最后由 ldy 于 2009-7-18 17:56 編輯 ]
[
本帖最后由 ldy 于 2009-11-4 17:34 編輯 ]