1、利用WebBrowser控件打开Web页面
I、建立窗体如下图
窗体由控件阐明:
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"><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)