ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > VBA的WEB应用系列教程——HTML文档篇

VBA的WEB应用系列教程——HTML文档篇

作者:绿色风 分类: 时间:2022-08-17 浏览:188
楼主
xmyjk
第一节课以及整个教程体系,请见:
VBA的WEB应用系列教程——HTTP通讯基础篇
http://www.exceltip.net/thread-37639-1-1.html



这一篇没想到整理完了有8600多字,想学习的就请耐心看吧,示例比较多。整个WORD文档如下:

html篇1.rar


wqm.zip


主要HTML代码案例.rar

VBA的WEB应用系列教程——HTML文档篇

      上节课,我们说了HTTP通讯,HTTP通讯一般情况返回的是啥呢?是页面的源代码。例如,我们访问百度,返回了,“<!doctype html><html>…”一大堆东西。就是,我们在页面点击右键,“查看页面源文件”,如图:

 
      我们的浏览器,正是把这堆源代码,翻译成我们可视的生动地页面的。就像VBA一样,这堆代码是什么语言呢,就是通常所说的,超文本标记语言。

      为啥叫标记语言,因为它只能用于展示,展示我们所看到的网页页面。不是编程语言哦。

      为啥叫超文本呢,大家仔细看,这堆源代码有什么特征呢,就是有很多<…>这样的文本,一般而言,我们把<…>叫做标签,细心的同学可以发现,标签都是成对出现的,例如“<title>百度一下,你就知道      </title>”。第一个叫做开始标签,第二个多带了个/叫结束标签。标签之间就是网页的文本,例如这个例子,就是我们网页标题的文本“百度一下,你就知道”。所以,标签的作用就是,给文本打上标记,告诉浏览器,怎么显示这个文本。例如本例,要求浏览器把“百度一下,你就知道”显示成网页的标题。HTML文档=文本+标签,所以就超文本啦。


 
      总之,HTML就是用来描述网页的语言,像上面所说的<title>这样的标签,是有一整套的,呵呵。

      我们的教程,并不是为了教大家,怎么去做网页,设计网页,因此,大家仅仅需要,大致的了解一些HTML系列的文本标记语言的基础即可,知道常用的几个标签,有什么用即可。



一、网页数据提取常见的HTML标签/元素
      上面说了,标签是用来描述网页的。浏览器读取HTML文档,识别标签,并按标签要求以网页进行显示文本。大部分标签都是成队出现的。

      起始标签和结束标签之间的所有文本,都叫做元素。也就是这个格式就是:
  1. <起始标签:也叫元素名>元素的内容<结束标签:/+元素名>
标签是可以拥有属性的,因此起始标签,有时候格式如下:
  1. <元素名 属性名称=”属性值”>
属性提供了元素的一些附加信息啦,后面我们讲具体标签,大家就会见到属性怎么用。

      另外,注意,元素是可以拥有元素的,即某个元素的内容有时候是一个子元素。

      元素这东西,比较抽象,我们可以把它且当作一个对象来理解,例如工作簿对象,每个工作簿的名称都不一样(属性),每个工作簿里面都有工作表(子元素),每个表都有名称(属性),里面填写的内容也不一样(元素的内容)。

      下面讲讲常见的和我们网页数据提取要常见的元素/标签。


      (一)        整体框架结构:
       每个网页文档,都是有个大致的框架,框架如下:
  1. <html>
  2.     <head> <!--注释:文档头部,文档相关消息,并不提供文档内容-->
  3.                 <title>
  4.                 网页标题
  5.                 </title>
  6.         </head>
  7.         <body> <!--注释:文档主体-->
  8.             网页文档主体
  9.         </body>
  10. </html>
把上面这段文本保存在TXT文件里面,然后另存.html格式,就可以得到最基础的页面。


 

 
      从上面的框架代码,我们可以看出,一般的页面,都有html元素,其一般内含两个元素,一个是head元素,一个是body元素。Head元素仅仅说明文档的相关消息,并不展示文档实体,body元素才是真正展示文档主体的,所有要在页面展示的元素,都要在body內进行书写。

      后面的元素的测试,都是以替换掉body元素内的文本“网页文档主体”进行书写,后续不再复述这个框架。



2楼
xmyjk
(二)段落<p>
      特别是提取小说,新闻等页面的消息,文本都是一段一段的,这样的页面,一般是通过<p>标签实现的。这个没啥好说的,自己动手试看看就知道。


 
      所以,当运用ie/webbrowser方式提取这类网页的时候,历遍段落p元素即可。
(三)超链接<a>
      超链接是我们最常见的页面元素,基本的门户网站都有他,点了以后,可以跳转到另一个页面。一般语法格式:
  1. <a href=”跳转的URL” target=” _blank/_self”>显示的超链接文本</a>
Target属性,表示的是,当我们点击超链接,是在原页面进行跳转(_self)还是新建页面进行跳转(_blank)。
      
      测试做个ET的超链接吧。


 
(四)图像<img>
      图像标签用法和超链接类似,语法:
  1. <img src=”url” alt=”文本”>
alt属性代表的是,当图片无法加载的时候,替换显示的文本。

      我们做个加载ET的LOGO的页面玩玩。(


 
(五)表格<table>
      表格是我们网页最常见的,也是我们网页数据提取,最需要打交道的,其实它非常简单,框架如下,每行用<tr>,每个单元格用<td>:
  1. <table border="1"> <!--注释:border设置表格边框样式-->
  2.         <tr>
  3.                 <td>第一行第一个单元格</td>
  4.                 <td>第一行第二个单元格</td>
  5.         </tr>
  6.         <tr>
  7.                 <td>第二行第一个单元格</td>
  8.                 <td>第二行第二个单元格</td>
  9.         </tr>
  10. </table>

 
(六)列表
      很多时候,数据也经常以列表形式存在的,列表有三种:无序、有序和自定义。分别框架如下:

      1、无序列表<ul>
  1. <ul>
  2. <li>函数</li>
  3. <li>VBA</li>
  4. </ul>

 
2、有序列表<ol>
  1. <ol>
  2. <li>图书
  3.    <ol>
  4.        <li>VBA</li>
  5.        <li>函数</li>
  6.            </ol>
  7.         </li>
  8. <li>视频
  9.    <ol>
  10.        <li>基操</li>
  11.        <li>图表</li>
  12. <li>数透</li>
  13.            </ol>
  14.         </li>
  15. </ol>

 
3、自定义列表<dl>
  1. <dl>
  2. <dt>第一节课</dt>
  3. <dd>网络通讯</dd>
  4. <dt>第二节课</dt>
  5. <dd>HTML</dd>
  6. </dl>

 



3楼
xmyjk
(七)表单和表单控件

      除了表格,表单也是我们在网页数据提取,页面操控最常见到的元素。例如我们注册用户,例如我们的微博登陆,例如我们的百度搜索,其实都是表单。我们先来看一个例子:
  1. <p>请在文本框输入要搜索的关键字,后按提交,将提交百度进行搜索</p>
  2. <form method="get" action="http://www.baidu.com/s">
  3.     <input name="wd" type="text" value="exceltip">
  4.     <input type="submit" value="提交">
  5. </form>

 
例如在文本框输入“苹果”后,按提交按钮:

 
       这个表单模拟的是百度搜索,在文本框输入关键字后,按提交,将跳转至百度的搜索结果的界面。呵呵,奇妙吧。如何实现的呢?

       细心的同学会发现吧,表单form这个元素,有“method”和“action”两个属性,action属性指定的就是,提交表单后,向这个属性指定URL发送http请求(呵呵,涉及到第一节课的知识啦),method这个属性设定的就是,要按照get或者post等方式发送http请求。复习下第一节课吧,采用get的方式呢,参数将在URL后面加个?号,然后发送,采用post的方式呢,将在消息主体里面投递查询参数。

       那发送http请求的参数从哪里来的?就是从表单元素内含的各种下属元素,提取其name属性的值,作为参数名,然后提取该元素的value属性作为参数值(value属性的值有时候是由我们输入的,例如本例,虽然我们指定了默认的value属性的值为exceltip,但是我们可以手动输入,把它修改成“苹果”)。然后浏览器就用参数名=参数值和&进行连接(还是上节课的知识)串起来。就如本例,提交后,观察URL为:http://www.baidu.com/s?wd=苹果,wb就是第一个input元素的属性值,苹果就是我们输入的,赋予第一个input元素的value属性的值。

       下面,我们讲讲表单主要的内含子元素吧。

      1、输入标签(<input>)
      其语法是:
  1. <input type=类型 name=元素名称 id=元素id value=元素值/>
其类型由type属性定义,常见的有:text(文本框)、Radio(单选按钮)、Checkboxes(复选框)、submit(提交按钮)、hidden(隐藏)、reset(重置)和password(密码框)等。其中注意,其中单选框和复选框的是否选中,由checked属性指定,如果值是”checked”则选定。不多说了,看例子吧。(文本框和提交按钮就不做了,上面都举例了。密码框同,类似的)
  1. <form>
  2. <input name="ch1" type="checkbox" value="excel" checked="checked">表格设计
  3. <input name="ch2" type="checkbox" value="word">文档处理
  4. <input name="ch3" type="checkbox" value="ppt" checked="checked">幻灯片
  5. </br>
  6. <input name="rd" type="radio" value="100" checked="checked">vip
  7. <input name="rd" type="radio" value="10">普通会员
  8. </br>
  9. <input type="reset" value="重置">
  10. </form>

 
      注意,当表单提交的时候,发送http请求时,单选框和复选框,仅发送checked属性为”checked”的元素。一样是把标记了checked的元素的name属性值和value属性值串起来。

2、下拉列表<select>
      其语法:
  1. <select multiple="multiple" name=名称 size=显示菜单条目数>
如果存在multiple="multiple"的属性设定,则允许菜单多选,否则单选。Size是设置可见的菜单条目数。其下级元素,option代表的是其每个菜单项目,语法为:
  1. <option value=值 selected="selected">显示文字</option>
一样,value属性接着的就是发往服务器的值,当提交的时候,就是将select的name属性值与用户选择的某项option元素的value属性值连接,进行发送。Option元素的selected属性设置的是默认选中的菜单项。示例如下:
  1.            <p>单选选择列表</p>
  2.            <form>
  3.                <select name="sel">
  4.                    <option value="1">图书</option>
  5.                    <option value="2">视频</option>
  6.                    <option value="3" selected="selected">动画</option>
  7.                    <option value="4">图解</option>
  8.                </select>
  9.            </form>
  10.            <p>多重选择列表,按住shift或ctrl键进行多重选择</p>
  11.            <form>
  12.                <select multiple="multiple" name="sel" size=2>
  13.                    <option>excel</option>
  14.                    <option>word</option>
  15.                    <option>ppt</option>
  16.                </select>
  17.            </form>

 
(八)框架<frame> 标签和<iframe> 标签

1、frameset和frame
      Frame是独立框架,就好像我们的分屏浏览一样,一个屏幕,浏览多个画面一样。语法如下:
  1. <html>
  2. <frameset cols="a%,b%,…"/ rows =”*,100”>
  3.       <frame src="页面A" />
  4.       <frame src="页面 B" />
  5. </frameset>
  6. </html>
首先框架必须放置在框架结构标签里面(<frameset>),其rows/columns 属性的值规定了框架每行或每列占据屏幕的面积。另外,frameset和body不能同时使用,除非有noframes,很简单,因为frame其实就描绘文档了,所以,一般不需要再有body进行描绘。另外,框架元素一般放置于head元素內。

      Frame元素的src属性就是设定了其框架内显示页面的URL。示例如下:
  1. <html> <!--注释:文档跟元素-->
  2.     <head> <!--注释:文档头部,文档相关消息,并不提供文档内容-->
  3.                 <title>
  4.                     框架测试文档
  5.                 </title>
  6.         <frameset rows="50%,50%">
  7.                <frame src="http://www.exceltip.net">
  8.                <frame src="http://www.baidu.com">
  9.         </frameset>
  10.         </head>
  11. </html>


 
2、iframe

      Iframe的框架,就类似画中画的效果,在原页面插入一个页面。语法如下:
  1. <iframe src =url scrolling=yes/no/auto height=xx width=xx>
Src设定框架内要显示的文档的url,scrolling设置是否显示滚动条。Height和widty设置的就是它的高度和宽度。案例如下:
  1. <p>第一个框架</p>
  2. <iframe src="http://www.w3school.com.cn"></iframe>     
  3.          </br>
  4.          <p>第二个框架</p>
  5.          <iframe src="http://www.baidu.com"></iframe>


 
      Html就大概讲这一些吧,呵呵,毕竟我们不是要做网页,大家大致了解下就是,还可以参考www.w3school.com.cn去学习。一般能做到,看得懂网页的框架结构即可。
4楼
xmyjk
二、HTML 文档对象模型(HTML DOM)

      认识了网页文档上面的各种元素,我们怎么访问他们呢,是通过什么机制实现的呢?

      HTML文档,向程序们,提供了访问其元素的端口,这就是HTML DOM,其定义了一套标准的针对 HTML 文档的对象访问或操作的机制。现在DOM有多个版本,本文还是以最基础的DOM 1(98年颁布)这个版本。

      1、VBA访问IE网页文档的程序模板

      讲访问前,我们先简要讲讲,如何用VBA调用IE,直接给个模板吧,详细的IE对象的属性和方法等,我们后面的课会再讲:
  1. Sub test()
  2. Dim ie, dmt
  3.     Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
  4.     With ie
  5.         .Visible = True '显示它
  6.         .navigate "http://www.baidu.com" '加载某个页面
  7.         Do Until .ReadyState = 4 '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
  11.         ‘开始操纵页面,或者提取数据啦
  12.     End With
  13. End Sub
通过上面这个模板,我们就可以创建一个IE对象,并将其页面文档对象赋予dmt变量,这样,我们通过dmt变量,就可对页面元素,进行后续的访问以及操作。

2、HTML DOM 对象
      和我们EXCEL的对象集合的层次结构类似(WORKBOOKS-WORKSHEETS-CELLS等),HTML DOM为网页文档也组织了一个对象集合的分层次模型。另外,从上一节标签和元素的学习,大家也可以大致的得知,元素是可以拥有元素的,所以,这个分层的模型完全是合理的。HTML DOM的对象模型类似如下图:


 
      但是,VBA直接支持调用的对象有限,如下:

 
      VBA支持直接调用对象的元素,调用就非常方便了,可以用序号调用,例如forms(0),也可以按名称/ID调用,例如forms(“名称/ID”)。

      其他没法直接调用对象的元素,可以间接从通用all对象集合中去调用该元素或该元素对应的dom对象,或者还可以从文档树模型去调用。如下阐述。

3、文档树
      在HTML DOM中,文档的每一部分都是节点,整个文档被定义为一个文档节点,每个标签是一个元素节点,包含在元素中的文本是文本节点,每一个元素的属性是一个属性节点。
  
      形象的比喻做一棵树吧,根节点就是html,主干就是body等,枝干就是body内含的各种元素节点,叶子和花就是元素节点关联的元素的属性(属性节点)或内含文本(文本节点)。自己画的图太丑了,直接引用w3school的图吧:


 
        当HTML DOM在解析网页文档的时候,就按整个文档的结构生成一棵树,全部保存在内存中,我们可以随时访问任何节点。

        总之,网页文档,可以说是由元素组合而成的,也可以说是由节点连接而成的树构造的。节点是文档树结构中特有的名词,元素是节点,但是节点不一定是元素,节点还有文档节点、文本节点、属性节点等;元素是元素节点的扩展,元素可以拥有属性还有文本。初学者不是很必要纠结元素和节点的区别,这个需要甚至数据结构、类和继承等知识。可大致理解为,同一个html dom对象,提供的两个不同接口。有兴趣的朋友,可以按F8运行下面这个程序,然后本地窗口观察bd这个dody对象,你会发现,他既有支持node(节点)的相关属性和方法,也提供了element(元素)的相关属性和方法。


 
  1. Sub test()
  2. Dim ie, dmt, bd
  3.     Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
  4.     With ie
  5.         .Visible = True '显示它
  6.         .navigate "http://www.baidu.com" '加载某个页面
  7.         Do Until .ReadyState = 4 '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set bd = dmt.body '将文档的body赋予bd变量
  12.     End With
  13. End Sub
5楼
xmyjk
4、如何通过文档树查找所需的网页元素

      打个比方吧,当我们要掏大树上的鸟窝,有几种方式呢?

      (1)首先,当我们可以目测到,鸟窝在哪个节点的时候,我们可以用梯子,爬上去,直接掏。因此,当我们可以很清晰的观测到,节点的某些属性时,就可以直接定位它。元素节点的主要的定位属性有:id、name和索引号。还记得吗,元素起始标签的语法:<标签 id="xx" name="xx" value=”xx”...>,当初一定很疑惑吧,为啥要有名字或id等属性,现在明白了吧,和我们的姓名和学号一样,为了比较容易的找到我们。

       那索引号是什么呢,就例如我们从树根出发,清点树上的果子,给每个果子编号,这样我们就很容易知道,哪个号的果子成熟了,或者被虫子咬了。一样的,我们可以按源代码书写的顺序,给每类的元素的成员进行编号(类似每类元素,形成一个数组,从0开始编号)。通过元素类别和编号,我们可以很容易的找到它。

      另外,例如我们中学的老师,上课时,要抓人提问,可以用学号,也可以通过小组,哪一排,第几个学生,起来提问。因此,索引号,也有整个文档的,和同类元素之分。殊途同归,无论你点这个学员的学号,还是从他的组别的座位号去找他,都是可以的。所以,按统计方式或者起始节点的不同,索引号也会不同。

      刚刚说的查找工具(也就是打比方里面的梯子)有以下这些:

      getElementById(“元素的id属性”)或all(“元素的id属性”):返回拥有指定id的元素集合

      getElementsByName(“元素的name属性”)或all(“元素的name属性”):返回拥有指定名称的元素的集合

      getElementsByTagName(“标签名称”)或all.tags(“标签名称”):返回该类标签的元素集合。

      all(索引号):返回指定索引号的元素节点。

      (2)其次,当我们仅听到鸟鸣声,却不知道鸟窝在哪里的时候,有时候,我们只能顺藤摸瓜,开始爬树,沿着树干进行判断,最后攀爬到鸟窝处。或者,可能大概知道个方位,先架梯子,到某个主干,再从那里开始查找。因此,当我们找不到清晰的属性去定位网页元素时,我们可以从body元素/节点开始,一级级去寻找,也可以先定位到它的毗邻节点/元素,再通过判断,去查找它的精确位置。

      从节点方面而言,树形的模型的节点有个特征,除了根节点,每个节点均只有一个父节点(parentNode),有一个或者多个子节点(childNodes,类似一个对象集合或对象数组,从0开始编号)。因此,通过节点的亲属关系,进行判断查找,我们就可以一步步的在父子节点中切换,获取所需的元素。节点有一些属性,可以利于我们的查找判断,如下:

      nodeName(节点名称):元素节点的名称为其标签名,属性节点的名称为其属性名称;

      nodeValue(节点值):文本节点的值为其包含的文本,属性节点的值为其包含的属性值;

      nodeType(节点类型):元素节点为1、属性节点为2、文本节点为3、注释节点为8、文档节点为9

      另外,从元素方面而言,要定位元素的父元素可以通过parentElement属性,定位元素的子元素集合可以通过children属性,判断其标签的名称(tagname),他的值(value),内含文本(innertext)等方式来进行查找。

      最后,定位节点/元素的下一个同级兄弟可以通过nextSibling属性,定位上一个同级兄弟可以用previousSibling属性。
示例的话,后面一起展示。先学懂方法吧。

5、网页元素分析工具

      工欲善其事,必先利其器,很多高手已经提供给我们很多好用的网页元素的分析工具,我们怎么用他们呢?讲两个工具,一个是网页精灵(按键精灵社区的作品),一个是firebug。

      首先是网页按键精灵。如附件
wqm.zip
,操作如下图,输入网址,按“网页分析”,然后按F9,将鼠标指向需要分析的页面元素,例如文本框,则得出元素相关的属性。


 
      下方得出的有,标签的名称,元素的id,元素的name,元素的索引号(第几个input标签,从0开始编号)。复习下上面说的概念?就想象网页文档是个班级,标签就是学习小组,其中input这个学习小组里面,有个人的名字name是wd,他的工号id是kw,它在小组里面座位号是0。我们,就是用这些标示,来找到这个元素的。

      另外,在firefox浏览器,还可以使用firebug,直接对页面元素单击右键,使用“使用firebug查看元素”的菜单。这样可以直接观察到该元素的网页源代码,然后进行分析。


 

6楼
xmyjk
6、常见HTML DOM 对象的属性、方法以及示例

(1)通用的属性和方法
      
      i.四个常用的通用属性:

      对象.innerHtml:对象内部的HTML代码

      对象.OuterHtml:对象的HTML代码,包括对象本身的HTML标签

      对象.innerText:对象内部的文本

      对象.OuterText:对象的文本,包括对象本身的文本

      举例,我们去捕捉百度首页,那个提交搜索的表单。这个表单的名称是”f”,然后查询它的innerHtml和OuterHtml。
  1. Sub test()
  2.     Dim ie, dmt, an
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://www.baidu.com"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set an = dmt.forms("f")
  12.         Debug.Print "innerHtml:", an.innerhtml
  13.         Debug.Print "OuterHtml:", an.OuterHtml
  14.     End With
  15. End Sub
观察一下立即窗口输出的区别,很容易就知道inner和outer的区别了。

      ii.一个常用的通用方法fireevent(发送事件)

      HTML DOM 对象,和我们EXCEL对象,都具有属性、方法和事件。前面所述的innerhtml那些都是属性,方法就是我们要给这个对象执行什么动作,比如点击网页上一个按钮,按钮这个对象就被“click”了,click就是按钮对象的一个方法。另外,网页对象也像我们的工作表一样,也支持识别事件,例如,当按钮被点击了,系统就会触发“oncilck”(被点击了这个事件),然后依据网页源代码里面设定好处理步骤去处理这个事件。

      主要的事件,整理如下:


 
      那fireevent这个方法又是何用呢,他的作用就是,代替我们的一些操作,直接激发某些对象的某些事件。

      例如我们附件的fireevent示例.html,点击文档主体的”点我一下”,将弹出对话框。下面,我们用程序模拟,这个点击事件的触发。新建一个excel,放置于和fireevent示例.html同文件夹下的目录里。


 
  1. Sub test()
  2.     Dim ie, dmt, fm
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate ThisWorkbook.Path & " \fireevent示例.html"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         dmt.body.FireEvent "onclick" '触发body的点击事件
  12.     End With
  13. End Sub
这样,程序就模拟了我们点击了body后激发的事件。一样,我们也可以用dmt.body.Click,这个方法取激发事件,殊途同归。

      Fireevent主要用于,有的表单的校验机制非常强,需要光标聚焦了,文本change了等等,才能提交表单,这些事件的模拟只能靠fireevent了,其他方法就很难替代了。

7楼
xmyjk
(2)表单和表单控件对象

      表单form对象,有一个方法比较重要,就是submit,这个方法提供了表单的提交的动作。如果我们捕捉页面的提交按钮非常困难,有时候只要对表单,执行submit方法,表单也是可以提交的,不需去点击提交按钮。

      表单控件,文本输入类控件,最常用就是value的属性了,通过这个属性,可以往文本框里面添加文本。
      
      单选框、复选框,常用的就是checked属性了,如果为true就是被选中了,或者直接使用click方法也行。
      
      下拉列表呢,如果是单选列表框,可通过selectedIndex属性去设置选中项(下拉选项,从1开始编号,如2就是选择下拉列表的第二个选项),也可以通过value属性,直接把value指定为要选定的option的value即可,但多选列表框不可用这两个属性。另外,所有类别的列表框,都可以通过其内含对象集合options(),设置某个options(x)的selected属性为true,来设置选中项。

      还是以百度首页为示例,我们用程序模拟键入查询数据“exceltip”,然后提交查询为演示吧。
  1. Sub test()
  2.     Dim ie, dmt, fm
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://www.baidu.com"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set fm = dmt.forms("f") '用表单的名称f,捕捉表单对象
  12.         dmt.all("kw").Value = "exceltip" '用搜索栏的id”kw”捕捉它,并键入exceltip
  13.         dmt.all.tags("input")(3).Click '用“百度一下”按钮的索引号捕捉它,并模拟按钮的点击
  14.         'fm.submit '模拟表单的提交,不一定要click
  15.     End With
  16. End Sub
(3)Table 对象

      表格对象,也是我们提取网页数据,最常打交道的对象了。其内含rows对象集合,可以使我们访问表格内的每行,每个row对象还内含cells对象集合,使我们可以访问其每行的每个单元格,读取每个单元格的innertext属性即可获取我们所需每个单元格的文本。

      另外,常用的属性还有length,这个类似我们VBA里面的count,都是返回某个对象的数量。

      我们以提取东方财富网的限售股解禁清单的table为例,URL:http://data.eastmoney.com/dxf/default.html。
  1. Sub test()
  2.     Dim ie, dmt, tb, i&, j&
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://data.eastmoney.com/dxf/default.html"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set tb = dmt.all.tags("table")(3) '通过索引号捕捉表格对象
  12.         For i = 0 To tb.Rows.Length - 1 '历遍其每个行
  13.             For j = 0 To tb.Rows(i).Cells.Length - 1 '历遍每行的每个单元格
  14.                 Cells(i + 1, j + 1) = tb.Rows(i).Cells(j).innertext '将其innertext写入单元格
  15.             Next
  16.         Next
  17.     End With
  18. End Sub
通过上面的代码,这个解禁清单就被我们提取下来了。


 
8楼
xmyjk
(4)框架frames对象

      Frame和iframe元素,均体现在frames对象集合里面。其最重要的属性就是document,也就是获取框架的页面文档。举个例子吧,提取一个网址为:http://www.w3school.com.cn/tiy/loadtext.asp?f=html_iframe的框架里面的图片的URL。

 
  1. Sub test()
  2.     Dim ie, dmt, idmt
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://www.w3school.com.cn/tiy/loadtext.asp?f=html_iframe"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set idmt = dmt.frames(0).document    '将框架里面的文档赋予idmt变量
  12.         Debug.Print idmt.images(0).src    '读取图片的URL
  13.     End With
  14. End Sub
(5)Anchor 对象

      文档中 <a> 标签每出现一次,就会创建 Anchor 对象。

      这个就没啥好示例的了,href属性返回被链接的URL,click可以模拟超链接被点击了。
9楼
xmyjk
(6)元素查找模板

      实在不懂得用网页元素分析工具的,那VBA里面,怎么实现,查找我们所需要的元素呢?

      以上面第三点,http://data.eastmoney.com/dxf/default.html,为例,查找那个table的索引号。
  1. Sub test()
  2.     Dim ie, dmt, tbs, i&, tb
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://data.eastmoney.com/dxf/default.html"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.         Set tbs = dmt.all.tags("table")    '获取所有的table对象集合
  12.         For i = 0 To tbs.Length - 1    '历遍每个table
  13.             If InStr(tbs(i).innertext, "解除限售日期") > 0 Then    '判断它的内含文本是否有某个关键字
  14.                 Debug.Print i
  15.                 Set tb = tbs(i)    '符合则捕捉这个表
  16.                 'Exit For '是否退出循环视文档架构,如果是表格套表格,很有可能是最后一个才是真正的数据表
  17.             End If
  18.         Next
  19.     End With
  20. End Sub
查找出来的索引号为3,和我们使用工具查找的一致。

 
      整个查找框架就是类似这样啦,其他元素的查找,也可以模拟这个框架进行改写。


      HTML DOM对象也就大概讲这么多吧,其余文中没提到的对象、属性、方法和事件,请参考如下网址进行学习:http://www.w3school.com.cn/htmldom/htmldom_reference.asp

      这节课就讲这么多吧,首先教会大家,怎么大概看懂HTML格式的网页源代码框架和介绍代码的主要语法规则,简要阐述了浏览器显示原理。进而,介绍了外部程序如何访问HTML文档,HTML DOM提供了哪些对象以及机制供外部访问,介绍了网页元素、文档树和节点的定义。最后,介绍了如何查找我们所需的网页元素,并简单的演示了,在VBA中如何访问和操控这些元素。
10楼
xmyjk
补充案例.zip


      补充案例两则

      清点了下帖子的讲过的网页元素,6楼,其实已经大部分列举过了常用元素在VBA里面的如何访问的示例了。大概只缺select元素,以及列表元素数据提取没有讲过。下面再举两个例子,另外也顺便补充下,如何在兄弟父子元素进行坐标切换。
本教程所举的例子,并不一定用网页元素访问的方式是最合适,仅仅为了举例让读者学习。很多可以用第一节课讲的,模拟收发包的来解决。

      第一个案例,我们在钻石估价网的表单里面,填入所需估价钻石的克拉数,颜色和净度,并模拟点击查询,然后读取查询的价格到VBA中进行显示。


 
      用firebug分析一下各个元素,发现都有id,就非常容易访问了。

 
      这样,填入表单的工作其实相对是比较简单的。读取查询结果就比较难了。用firebug分析:

 
      会发现,其实他就位于,我们查询的表单form的下面那个div元素里面,这下就好办了,坐标从form元素向下切换一个兄弟元素,那个div元素里面,就有我们需要的文本。

     还有个难点,我们捕捉元素非常容易,但是,怎么捕捉元素的所在表单呢,通过查询w3school的对象手册,我们会发现,表单内含的所有元素,都有.form这个端口,可以使我们非常容易的获取该元素所在的表单。呵呵,分析完毕,可以开始书写代码了。如下:
  1. Sub test()
  2.     Dim ie, dmt
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://www.525zb.com/tool/diamond-price"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.     End With
  12.     With dmt
  13.         .all("carat").Value = "1"    '输入克拉数
  14.         .all("color").Value = "E"    '输入颜色
  15.         .all("clarity").Value = "VVS1"    '输入净度
  16.         .all("act").Click    '提交查询
  17.         Do Until ie.ReadyState = 4 And ie.busy = False    '等待页面加载完毕
  18.             DoEvents
  19.         Loop
  20.         With .all("carat").form.NextSibling '获取表单元素的下一个元素
  21.             MsgBox .Children(0).innertext & vbCrLf _ '读取我们查询的钻石样式文本
  22.                    & Format(.Children(1).innertext, "#,##0.00") & "元"    '获取价格
  23.         End With
  24.     End With
  25. End Sub
案例二:http://data.eastmoney.com/executive/ranklist_in.html
      读取,东方财富网,高管增减持排行榜,的第一页的页面内容,不讲翻页,因为涉及到一些脚本等高级知识,后面的课程再讲,怕消化不了,实在有兴趣的同学,可以站内信联系我。

 
    看了截图,有些人可能要跳起来了,这个我会,不就是个表单嘛。呵呵,请大家用firebug等分析工具看看,呵呵,你错了,每行是一个ul,每行的每个单元格是个li,翻主体教材呵呵,列表,我们有举例过。而且,表头,和表的主体,是两个分割的部分。不是那么好读取的。

     首先,我们先读取主体数据吧,用分析工具如图解析:


 
      数据其实都在id为datacont的div里面,div元素的下面的每个ul就是行,ul里面的li就是每个单元格了。这个无非就是历遍,读取Innertext。我们的读取,要撇去最后一列,不要读取那个自选股的就是,无用数据。
那表头怎么办,继续分析:


 

      其实,它是表的主体内容的那个div,上一个兄弟元素ul里面,一样,每个单元格就是一个li。最后,书写代码如下:
  1. Sub test()
  2.     Dim ie, dmt, div, ul, i&, j&
  3.     Set ie = CreateObject("InternetExplorer.Application")    '创建一个IE对象
  4.     With ie
  5.         .Visible = True    '显示它
  6.         .navigate "http://data.eastmoney.com/executive/ranklist_in.html"    '加载某个页面
  7.         Do Until .ReadyState = 4    '等待页面加载完毕
  8.             DoEvents
  9.         Loop
  10.         Set dmt = .document    '将IE浏览器加载的页面文档,赋予dmt变量
  11.     End With
  12.     Set div = dmt.all("datacont") '获取数据表所在的div标签
  13.     For i = 0 To div.Children.Length - 1 '历遍每个ul
  14.         Set ul = div.Children(i) '获取每个ul
  15.         For j = 0 To ul.Children.Length - 2 '历遍每个ul项下的li
  16.             Cells(i + 2, j + 1) = ul.Children(j).innertext '将每个li的文本给予单元格,最后一个自选股是不要的所以-2
  17.         Next
  18.     Next
  19.     Set ul = div.PreviousSibling '获取ul的上面那个兄弟元素,就是表头的ul
  20.     For j = 0 To ul.Children.Length - 2 '历遍表头ul的每个li
  21.         Cells(1, j + 1) = ul.Children(j).innertext '填写表头到单元格
  22.     Next
  23. End Sub
11楼
Eric__宇
我在帮你占一个,哈哈
12楼
い卋玑┾宝珼
果断踩,妃妃V5
13楼
白米饭
很强大的网页提取资料
14楼
peterchen
月GG辛苦了,感谢分享!
15楼
amiaosheng
哇塞 好详细啊**!顶一下
16楼
zhengguide
v587!
谢谢!xmyjk !
17楼
w83365040371
很强大....
18楼
水星钓鱼
精华之作,相见恨晚。
19楼
筱悠
太强大了~  仰望
20楼
wdextip001
好强大哟,楼主辛苦了
21楼
LastDday
版主果然是版主啊  看了你的帖子 让我茅塞顿开啊 哈哈
22楼
LastDday
为什么我不能下载附件啊
23楼
yeyoo
绝对的实用啊,早年自己摸了好久
24楼
E林好汉
还有后续吗?
25楼
bensonlei
牛人真多
26楼
Eric__宇
期待师傅后续作品
27楼
gdlsl91
楼主下一篇快出吧,期待中!
28楼
04084324
谢谢分享
29楼
ryan_c
众里寻他千百度,这就是我要找的,十分感谢啊
30楼
水星钓鱼
这周总算摸索出来了,下周开始进阶
31楼
qiaoyu05
哇。太**了。好东西啊,很好用,学会了可以大大降低工作时间,提高工作效率。大神 。
32楼
ryan_c
V587,还有么?
33楼
hnfgcjh
现在还看不明白,将来再学习。
34楼
magicshadow
版主你好,请问后续的课程是否也已经发布了呢?很渴望继续学习
35楼
Daniel老莫
谢谢楼主! 正好需要用这个提取网页数据!
36楼
moresite
非常的感谢,我现在正有个这方面的项目需要做,正需要这方面的资料呢。
37楼
Smallk
好教程啊,小白看了很快就懂了
38楼
枫舞
非常方便学习,辛苦了,谢谢
39楼
keven
正需要这方面的东西 非常感谢!
40楼
老糊涂
很强大

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap