1、利用WebBrowser控件打开Web页面

I、建立窗体如下图

窗体由控件阐明:

jsp获取iframe中列表行数WebBrowser控件网页数据抓取I  EXCEL VBA22 Ruby

CommandButton1:【打开网页】命令按钮;CommandButton2:【网页数据抓取】命令按钮;TextBox1:网址文本框(单行)TextBox2:网页HTML文档文本框(多行)。
设置Multiline属性为True、ScrollBars属性为2;WebBrowser1:网页控件

II、打开Web页面

打开窗体后利用窗体初始化事宜Initialize加载指定网页

Private Sub UserForm_Initialize()WebBrowser1.Navigate "http://www.galaxystatistics.com/excel/excelVBA2.html"End Sub打开窗体时利用CommandButton1【打开网页】命令按钮打开TextBox1网址文本框中指定的网页

Private Sub CommandButton1_Click()WebBrowser1.Navigate TextBox1.TextEnd Sub网页加载成功后实行WebBrowser1的DocumentComplete事宜,在TextBox2文本框显示网页HTML文档

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)Dim doc As ObjectSet doc = WebBrowser1.DocumentTextBox2.Text = doc.DocumentElement.innerHTMLTextBox2.SetFocusEnd Sub

常日,利用浏览器打开网页后,在页面点击鼠标右键,弹出菜单如此,

点击【查看网页源代码(V)】,可以查看网页HTML文档。

本文案例网页为“http://www.galaxystatistics.com/excel/excelVBA2.html”,文档如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<html><head><title>Excel Train</title><meta charset="utf-8"/><style>.testTB{color:#ff0000;}</style><script type="text/javascript">function oSum(x,y) {return x+y;}//无参数调用 function alertNull(){ alert("WebBrowser call!"); }//有参数调用 function callWithPar(name, address) { alert("Name is " + name + "; address is " + address); } </script></head><body scroll="yes" bgcolor="#E3F3F9" style="border:none"><h4>表格一</h4><table id="myTB2" class="testTB" border=0 cellspacing=0 cellpadding=5 width="100%" style="border-top:2px solid #000000; border-bottom:2px solid #000000; width:50%;"> <tr><th style="border-right:1px solid #000000;">产量</th><th style="border-right:1px solid #000000;">人数</th><th>累计人数</th></tr> <tr> <td style="border-top:1px solid #000000; border-right:1px solid #000000;">4</td> <td style="border-top:1px solid #000000; border-right:1px solid #000000;">8</td> <td style="border-top:1px solid #000000;">8</td> </tr> <tr> <td style="border-right:1px solid #000000;">5</td> <td style="border-right:1px solid #000000;">22</td> <td>30</td> </tr> <tr> <td style="border-right:1px solid #000000;">6</td> <td style="border-right:1px solid #000000;">42</td> <td>72</td> </tr> <tr> <td style="border-right:1px solid #000000;">7</td> <td style="border-right:1px solid #000000;">38</td> <td>110</td> </tr> <tr> <td style="border-right:1px solid #000000;">8</td> <td style="border-right:1px solid #000000;">17</td> <td>127</td></tr> <tr> <td style="border-right:1px solid #000000;">9</td> <td style="border-right:1px solid #000000;">3</td> <td>130</td> </tr> <tr> <td style="border-top:1px solid #000000; border-right:1px solid #000000;">合计</td> <td style="border-top:1px solid #000000; border-right:1px solid #000000;">130</td> <td style="border-top:1px solid #000000;"></td> </tr> </table><p><h4>表格二</h4><table class="testTB" border=1 cellspacing=0 cellpadding=5 width="50%"><tr><th>姓名</th><th>民族</th></tr><tr><td>张三</td><td>汉族</td></tr><tr><td>李四</td><td>回族</td></tr></table><form name="myFc"><h4>表格三</h4><table><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#a51020;">1、文本框</th></tr><tr><td> 姓名:</td><td><input id="myName" style="width:100px; color:#ff0000;" value="张三" onchange="alert(111)"/></td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">2、单选按钮</th></tr><tr><td> 性别:</td><td><input type="radio" name="myGender" value="1" checked/>男 <input type="radio" name="myGender" value="0"/>女</td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">3、复选框</th></tr><tr><td> 爱好:</td><td><input type="checkbox" name="myLike" value="1"/>篮球 <input type="checkbox" name="myLike" value="2"/>拍浮 <input type="checkbox" name="myLike" value="3"/>跑步</td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">4、下拉列表</th></tr><tr><td> 专业:</td><td><select id="myMajor"> <option value="1">数学</option> <option value="2">统计学</option> <option value="3">寿险精算</option> <option value="4">R措辞</option></select></td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">5、多行文本</th></tr><tr><td> 简介:</td><td><textarea id="myIntroduction" style="width:300px; height:100px; color:#555555;">WebBrowser控件是Internet Explorer的主窗口,它是作为一个ActiveX控件来包装的。
用户可以利用WebBrowser控件打开任何IE能够显示的Web页面,并提取页面数据。
如有自己的网站,可利用WebBrowser控件实现EXCEL文档和做事器间数据交流</textarea></td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">6、DIV区块</th></tr><tr><td> 效果:</td><td><div id="myEffect" style="width:300px; height:50px; border:#aaaaaa 1px solid; dsiplay:inline;"><b style="text-align:center; width:100%; padding-top:15px;">这是黑体效果</b></div></td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">7、图片</th></tr><tr><td> 头像:</td><td><img src="http://studio.galaxystatistics.com/shiny/rSHIndex/pic/vba1.jpg" id="myImg" style="width:200px; height:260px; color:#ff0000;"/></td></tr><tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">8、内崁iFrame框架</th></tr><tr><td> 框架:</td><td><iframe src="http://www.galaxystatistics.com/excel/excelVBA1.html" id="myIframe" style="width:380px; height:260px; color:#ff0000;"/></td></tr></table></form></body></html>

2、解析HTML文档

WebBrowser控件网页数据抓取必须具备一定根本的网页编程知识。
常日,网页数据抓取的工具为网页中的table标签,统计数据每每以表格形式来呈现。

I、通过table标签的id属性抓取表格数据

网页中任何标签都可以设定id属性做为唯一标识,对付设定id属性的HTML标签,可以用DOM文档模型的Document.getElementById得到该标签。

案例网页为“http://www.galaxystatistics.com/excel/excelVBA2.html”中第一个table标签为,

<h4>表格一</h4><table id="myTB2" class="testTB" border=0 cellspacing=0 cellpadding=5 width="100%"> ... </table>

这里table标签的id属性为id="myTB2",CommandButton2【网页数据抓取】命令按钮代码如下:

Private Sub CommandButton2_Click()Dim tbRows As IntegerDim tbCols As IntegerDim i, j As Integer'通过id属性得到table标签工具Set doc = WebBrowser1.Document.getElementById("myTB2")'得到表格行数tbRows = doc.Rows.Length'得到表格列数tbCols = doc.Rows(0).Cells.LengthSheet1.Cells.ClearFor i = 0 To tbRows - 1 For j = 0 To tbCols - 1'按行、列将表格数据写入EXCEL表格 Sheet1.Cells(i + 1, j + 1) = doc.Rows(i).Cells(j).innerText Next jNext iEnd Sub

II、通过table标签凑集抓取表格数据

有时网页中要抓取的标签没设定id属性,这时可通过DOM文档模型的Document.getElementsByTagName得到该标签凑集。
CommandButton2【网页数据抓取】命令按钮代码如下:

Dim tables As Object' 获取文档中所有的table凑集Set tables = WebBrowser1.Document.getElementsByTagName("table")' 获取文档中第2个table工具Set doc = tables(1)Dim tbRows As IntegerDim tbCols As IntegerDim i, j As IntegertbRows = doc.Rows.LengthtbCols = doc.Rows(0).Cells.LengthSheet1.Cells.ClearFor i = 0 To tbRows - 1 For j = 0 To tbCols - 1 Sheet1.Cells(i + 1, j + 1) = doc.Rows(i).Cells(j).innerText Next jNext i

解析HTML文档是一个人机对话过程,开拓者须要对HTML文档构造和EXCEL VBA编程有足够的履历。

这里先容了网页table标签中数据抓取的方法,对付其它网页标签(div、textarea、img等),基本都可以有DOM的Document.getElementById和Document.getElementsByTagName方法得到抓取工具。
至于不同网页标签的进一步解析,则须要对HTML文档构造有一定程度的理解。

本文代码利用InternetExplorer运行通过,如果利用Chrome浏览器或Firefox浏览器加载网页,HTML文档解析过程可能略有差异。

参考文章:

Web Browser控件与网页互动 - EXCEL VBA(21)