元素集合(table元素里面可以直接使用)All
对象集合,提供对文档中所有HTML元素的访问。
VBA支持直接调用对象的元素,调用就非常方便了,可以用序号调用,例如forms(0),也可以按名称/ID调用,例如forms(“名称/ID”)。
其他没法直接调用对象的元素,可以间接从通用all对象集合中去调用该元素或该元素对应的dom对象,或者还可以从文档树模型去调用。
如下阐述。
3、文档树
在HTMLDOM中,文档的每一部分都是节点,整个文档被定义为一个文档节点,每个标签是一个元素节点,包含在元素中的文本是文本节点,每一个元素的属性是一个属性节点。
形象的比喻做一棵树吧,根节点就是html,主干就是body等,枝干就是body内含的各种元素节点,叶子和花就是元素节点关联的元素的属性(属性节点)或内含文本(文本节点)。
自己画的图太丑了,直接引用w3school的图吧:
当HTMLDOM在解析网页文档的时候,就按整个文档的结构生成一棵树,全部保存在内存中,我们可以随时访问任何节点。
总之,网页文档,可以说是由元素组合而成的,也可以说是由节点连接而成的树构造的。
节点是文档树结构中特有的名词,元素是节点,但是节点不一定是元素,节点还有文档节点、文本节点、属性节点等;元素是元素节点的扩展,元素可以拥有属性还有文本。
初学者不是很必要纠结元素和节点的区别,这个需要甚至数据结构、类和继承等知识。
可大致理解为,同一个htmldom对象,提供的两个不同接口。
有兴趣的朋友,可以按F8运行下面这个程序,然后本地窗口观察bd这个dody对象,你会发现,他既有支持node(节点)的相关属性和方法,也提供了element(元素)的相关属性和方法。
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。
首先是网页按键精灵。
如附件,操作如下图,输入网址,按“网页分析”,然后按F9,将鼠标指向需要分析的页面元素,例如文本框,则得出元素相关的属性。
下方得出的有,标签的名称,元素的id,元素的name,元素的索引号(第几个input标签,从0开始编号)。
复习下上面说的概念?
就想象网页文档是个班级,标签就是学习小组,其中input这个学习小组里面,有个人的名字name是wd,他的工号id是kw,它在小组里面座位号是0。
我们,就是用这些标示,来找到这个元素的。
另外,在firefox浏览器,还可以使用firebug,直接对页面元素单击右键,使用“使用firebug查看元素”的菜单。
这样可以直接观察到该元素的网页源代码,然后进行分析。
6、常见HTMLDOM对象的属性、方法以及示例
(1)通用的属性和方法
i.四个常用的通用属性
对象.innerHtml:
对象内部的HTML代码
对象.OuterHtml:
对象的HTML代码,包括对象本身的HTML标签
对象.innerText:
对象内部的文本
对象.OuterText:
对象的文本,包括对象本身的文本
举例,我们去捕捉XX首页,那个提交搜索的表单。
这个表单的名称是”f”,然后查询它的innerHtml和OuterHtml。
观察一下立即窗口输出的区别,很容易就知道inner和outer的区别了。
ii.一个常用的通用方法fireevent(发送事件)
HTMLDOM对象,和我们EXCEL对象,都具有属性、方法和事件。
前面所述的innerhtml那些都是属性,方法就是我们要给这个对象执行什么动作,比如点击网页上一个按钮,按钮这个对象就被“click”了,click就是按钮对象的一个方法。
另外,网页对象也像我们的工作表一样,也支持识别事件,例如,当按钮被点击了,系统就会触发“oncilck”(被点击了这个事件),然后依据网页源代码里面设定好处理步骤去处理这个事件。
主要的事件,整理如下:
事件
适用元素
何时触发
onload
Body和frame
文档加载时
onchange
表单元素
当元素改变时
onsubmit
表单元素
当表单被提交时
onreset
表单元素
当表单被重置时
onselect
表单元素
当元素被选取时
onblur
表单元素和超链接元素
当元素失去焦点时
onfocus
表单元素和超链接元素
当元素获得焦点时
onkeydown
Body和表单元素
当键盘被按下时
onkeypress
Body和表单元素
当键盘被按下后又松开时
onkeyup
Body和表单元素
当键盘被松开时
onclick
大部分元素
当鼠标被单击时
ondblclick
大部分元素
当鼠标被双击时
onmousedown
大部分元素
当鼠标按钮被按下时
onmousemove
大部分元素
当鼠标指针移动时
onmouseout
大部分元素
当鼠标指针移出某元素时
onmouseover
大部分元素
当鼠标指针悬停于某元素之上时
onmouseup
大部分元素
当鼠标按钮被松开时
那fireevent这个方法又是何用呢,他的作用就是,代替我们的一些操作,直接激发某些对象的某些事件。
例如我们附件的fireevent示例.html,点击文档主体的”点我一下”,将弹出对话框。
下面,我们用程序模拟,这个点击事件的触发。
新建一个excel,放置于和fireevent示例.html同文件夹下的目录里。
这样,程序就模拟了我们点击了body后激发的事件。
一样,我们也可以用dmt.body.Click,这个方法取激发事件,殊途同归。
Fireevent主要用于,有的表单的校验机制非常强,需要光标聚焦了,文本change了等等,才能提交表单,这些事件的模拟只能靠fireevent了,其他方法就很难替代了。
(2)表单和表单控件对象
表单form对象,有一个方法比较重要,就是submit,这个方法提供了表单的提交的动作。
如果我们捕捉页面的提交按钮非常困难时,有时候只要对表单,执行submit方法,表单也是可以提交的,不需去点击提交按钮。
表单控件,文本输入类控件,最常用就是value的属性了,通过这个属性,可以往文本框里面添加文本。
单选框、复选框,常用的就是checked属性了,如果为true就是被选中了,或者直接使用click方法也行。
下拉列表呢,可以通过select对象的selectedIndex属性去设置选中项,也可以通过其内含对象集合options(),设置某个options(x)的selected属性为true,来设置选中项。
还是以XX首页为示例,我们用程序模拟键入查询数据“exceltip”,然后提交查询为演示吧。
(3)Table对象
表格对象,也是我们提取网页数据,最常打交道的对象了。
其内含rows对象集合,可以使我们访问表格内的每行,每个row对象还内含cells对象集合,使我们可以访问其每行的每个单元格,读取每个单元格的innertext属性即可获取我们所需每个单元格的文本。
另外,常用的属性还有length,这个类似我们VBA里面的count,都是返回某个对象的数量。
我们以提取东方财富网的限售股解禁清单的table为例,URL:
通过上面的代码,这个解禁清单就被我们提取下来了。
(4)框架frames对象
Frame和iframe元素,均体现在frames对象集合里面。
其最重要的属性就是document,也就是获取框架内的页面文档。
举个例子吧,提取一个网址为:
(5)Anchor对象
文档中标签每出现一次,就会创建Anchor对象。
这个就没啥好示例的了,href属性返回被链接的URL,click可以模拟超链接被点击了。
(6)元素查找模板
实在不懂得用网页元素分析工具的,那VBA里面,怎么实现,查找我们所需要的元素呢?
以上面第三点,
查找出来的索引号为3,和我们使用工具查找
展开阅读全文
相关搜索