- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-27 00:01:14
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-29 21:32 编辑
补充案例.zip
(104.66 KB, 下载次数: 499)
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-26 23:58:36
|
显示全部楼层
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-26 23:58:55
|
显示全部楼层
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-26 23:59:26
|
显示全部楼层
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-26 23:59:46
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-27 01:55 编辑
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
(1.52 MB, 下载次数: 549)
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-27 00:00:02
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-27 01:20 编辑
6、常见HTML DOM 对象的属性、方法以及示例
(1)通用的属性和方法
i.四个常用的通用属性:
对象.innerHtml:对象内部的HTML代码
对象.OuterHtml:对象的HTML代码,包括对象本身的HTML标签
对象.innerText:对象内部的文本
对象.OuterText:对象的文本,包括对象本身的文本
举例,我们去捕捉百度首页,那个提交搜索的表单。这个表单的名称是”f”,然后查询它的innerHtml和OuterHtml。- Sub test()
- Dim ie, dmt, an
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate "http://www.baidu.com" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- Set an = dmt.forms("f")
- Debug.Print "innerHtml:", an.innerhtml
- Debug.Print "OuterHtml:", an.OuterHtml
- End With
- End Sub
复制代码 观察一下立即窗口输出的区别,很容易就知道inner和outer的区别了。
ii.一个常用的通用方法fireevent(发送事件)
HTML DOM 对象,和我们EXCEL对象,都具有属性、方法和事件。前面所述的innerhtml那些都是属性,方法就是我们要给这个对象执行什么动作,比如点击网页上一个按钮,按钮这个对象就被“click”了,click就是按钮对象的一个方法。另外,网页对象也像我们的工作表一样,也支持识别事件,例如,当按钮被点击了,系统就会触发“oncilck”(被点击了这个事件),然后依据网页源代码里面设定好处理步骤去处理这个事件。
主要的事件,整理如下:
那fireevent这个方法又是何用呢,他的作用就是,代替我们的一些操作,直接激发某些对象的某些事件。
例如我们附件的fireevent示例.html,点击文档主体的”点我一下”,将弹出对话框。下面,我们用程序模拟,这个点击事件的触发。新建一个excel,放置于和fireevent示例.html同文件夹下的目录里。
- Sub test()
- Dim ie, dmt, fm
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate ThisWorkbook.Path & " \fireevent示例.html" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- dmt.body.FireEvent "onclick" '触发body的点击事件
- End With
- End Sub
复制代码 这样,程序就模拟了我们点击了body后激发的事件。一样,我们也可以用dmt.body.Click,这个方法取激发事件,殊途同归。
Fireevent主要用于,有的表单的校验机制非常强,需要光标聚焦了,文本change了等等,才能提交表单,这些事件的模拟只能靠fireevent了,其他方法就很难替代了。
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-27 00:00:24
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-29 09:55 编辑
(2)表单和表单控件对象
表单form对象,有一个方法比较重要,就是submit,这个方法提供了表单的提交的动作。如果我们捕捉页面的提交按钮非常困难,有时候只要对表单,执行submit方法,表单也是可以提交的,不需去点击提交按钮。
表单控件,文本输入类控件,最常用就是value的属性了,通过这个属性,可以往文本框里面添加文本。
单选框、复选框,常用的就是checked属性了,如果为true就是被选中了,或者直接使用click方法也行。
下拉列表呢,如果是单选列表框,可通过selectedIndex属性去设置选中项(下拉选项,从1开始编号,如2就是选择下拉列表的第二个选项),也可以通过value属性,直接把value指定为要选定的option的value即可,但多选列表框不可用这两个属性。另外,所有类别的列表框,都可以通过其内含对象集合options(),设置某个options(x)的selected属性为true,来设置选中项。
还是以百度首页为示例,我们用程序模拟键入查询数据“exceltip”,然后提交查询为演示吧。- Sub test()
- Dim ie, dmt, fm
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate "http://www.baidu.com" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- Set fm = dmt.forms("f") '用表单的名称f,捕捉表单对象
- dmt.all("kw").Value = "exceltip" '用搜索栏的id”kw”捕捉它,并键入exceltip
- dmt.all.tags("input")(3).Click '用“百度一下”按钮的索引号捕捉它,并模拟按钮的点击
- 'fm.submit '模拟表单的提交,不一定要click
- End With
- End Sub
复制代码 (3)Table 对象
表格对象,也是我们提取网页数据,最常打交道的对象了。其内含rows对象集合,可以使我们访问表格内的每行,每个row对象还内含cells对象集合,使我们可以访问其每行的每个单元格,读取每个单元格的innertext属性即可获取我们所需每个单元格的文本。
另外,常用的属性还有length,这个类似我们VBA里面的count,都是返回某个对象的数量。
我们以提取东方财富网的限售股解禁清单的table为例,URL:http://data.eastmoney.com/dxf/default.html。- Sub test()
- Dim ie, dmt, tb, i&, j&
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate "http://data.eastmoney.com/dxf/default.html" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- Set tb = dmt.all.tags("table")(3) '通过索引号捕捉表格对象
- For i = 0 To tb.Rows.Length - 1 '历遍其每个行
- For j = 0 To tb.Rows(i).Cells.Length - 1 '历遍每行的每个单元格
- Cells(i + 1, j + 1) = tb.Rows(i).Cells(j).innertext '将其innertext写入单元格
- Next
- Next
- End With
- End Sub
复制代码 通过上面的代码,这个解禁清单就被我们提取下来了。
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-27 00:00:41
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-27 01:37 编辑
(4)框架frames对象
Frame和iframe元素,均体现在frames对象集合里面。其最重要的属性就是document,也就是获取框架的页面文档。举个例子吧,提取一个网址为:http://www.w3school.com.cn/tiy/loadtext.asp?f=html_iframe的框架里面的图片的URL。
- Sub test()
- Dim ie, dmt, idmt
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate "http://www.w3school.com.cn/tiy/loadtext.asp?f=html_iframe" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- Set idmt = dmt.frames(0).document '将框架里面的文档赋予idmt变量
- Debug.Print idmt.images(0).src '读取图片的URL
- End With
- End Sub
复制代码 (5)Anchor 对象
文档中 <a> 标签每出现一次,就会创建 Anchor 对象。
这个就没啥好示例的了,href属性返回被链接的URL,click可以模拟超链接被点击了。
- 超级版主
- 积分
- 4530
- 学习力
-
- 教学分
-
- 技术分
-
- 魅力值
-
- 影响力
-
- 消费券
- Ti币
- 好友
- 记录
- 日志
- 分享
- 在线时间
- 小时
- 最后登录
- 1970-1-1
- 月度优秀
- 次
- 管理次数
- 次

楼主
|
发表于 2012-8-27 00:00:57
|
显示全部楼层
本帖最后由 xmyjk 于 2012-8-29 21:24 编辑
(6)元素查找模板
实在不懂得用网页元素分析工具的,那VBA里面,怎么实现,查找我们所需要的元素呢?
以上面第三点,http://data.eastmoney.com/dxf/default.html,为例,查找那个table的索引号。- Sub test()
- Dim ie, dmt, tbs, i&, tb
- Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
- With ie
- .Visible = True '显示它
- .navigate "http://data.eastmoney.com/dxf/default.html" '加载某个页面
- Do Until .ReadyState = 4 '等待页面加载完毕
- DoEvents
- Loop
- Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
- Set tbs = dmt.all.tags("table") '获取所有的table对象集合
- For i = 0 To tbs.Length - 1 '历遍每个table
- If InStr(tbs(i).innertext, "解除限售日期") > 0 Then '判断它的内含文本是否有某个关键字
- Debug.Print i
- Set tb = tbs(i) '符合则捕捉这个表
- 'Exit For '是否退出循环视文档架构,如果是表格套表格,很有可能是最后一个才是真正的数据表
- End If
- Next
- End With
- End Sub
复制代码 查找出来的索引号为3,和我们使用工具查找的一致。
整个查找框架就是类似这样啦,其他元素的查找,也可以模拟这个框架进行改写。
HTML DOM对象也就大概讲这么多吧,其余文中没提到的对象、属性、方法和事件,请参考如下网址进行学习:http://www.w3school.com.cn/htmldom/htmldom_reference.asp
这节课就讲这么多吧,首先教会大家,怎么大概看懂HTML格式的网页源代码框架和介绍代码的主要语法规则,简要阐述了浏览器显示原理。进而,介绍了外部程序如何访问HTML文档,HTML DOM提供了哪些对象以及机制供外部访问,介绍了网页元素、文档树和节点的定义。最后,介绍了如何查找我们所需的网页元素,并简单的演示了,在VBA中如何访问和操控这些元素。
关闭
站长推荐
/1
Excel技巧网的会员探讨问题仅代表其个人意见,与网站的立场无关。任何违反国家和地方相关法律法规的言论,本站有义务协助政府相关部门追究发言者的责任!
本站中非注明转载文章与案例的版权为作者与Excel技巧网共有。若非原文作者,本站之外任何单位或个人未经允许,不得将其用于商业用途。
若非原文作者,任何形式的非商业性转载必须获得Excel技巧网或作者允许,并注明作者和出处。
会员发表的帖子如涉及版权纠纷,须自行负责。详情请参考注册时的网站服务条款。
本站特聘法律顾问:沈学律师