-
IE
和文档对象模型
我们在实际工作中遇到网站和网页相关往往要涉及到这类问题:
如何下载网页数据?网页
之
间的通讯是怎么实现的、
它们能不能被控制等等。
分析网页根据不同协变色镜可以用不同的
角度去看,如数据流、标记,不过
,如果你是用
VB/VBA/
脚本或其它支持自动化对象
(
AUTOMATION
)的语言编程,有一
个值得了解方法是掌握对象模型,将网页视为对象来
自行控制,
这个方法需要了解的是
IE
的自动化对象
(InternetExplorer
.Application)
< br>或
IE
控件
(
< br>Microsoft Internet Controls
)
< br>,以及标准的文档对象模型(
Document
)
以下代码在
VBA
环境下进行试验——我不在意你是用
WORD
还是
EXCEL
——可以先做一行
过程模块,也可以在立
即窗口下逐行输入:
Set
ieA
=
CreateObject(
‘创建对象
e
=
True
‘使
IE
页
面可见,做完这一步,在
VBA
之外可以看到一个新
的
IE
te
‘空白页
这几行代码的作用是创建一
个
IE
应用程序对象(是的,相当于一个
IE
应用程序)
,并打开
一个空白的
网页。这个网页独立于
VBA
的应用程序(
WORD
或
EXCEL
)之外,事
实上,你
必须自已关掉它,或者用
下令
退出——注意一下,单纯的关闭
VBA
或
SET
ieA=nothing
是不会退出这个网页的。当
然,如果你正在上网并且愿意,在第
3
行也可以将
第
3
行的字符串替换成一个网站的名字,或者替换成
一个你主机中的文档名——比如
C:
,
或
D:
,
正如你在
IE
地址栏输入名称浏览这些文档一样。
另一种
可选择的方法是直接在
VB/VBA
的窗体或工作
表等宿主上增加一个的
WEB
BROWS
< br>浏览器
控件,也相当于上面的
IE
应用程序
注:
WEB
BROWSE
控件和单独的
IE
< br>程序并不是完全相同的,例如
WEB
控件不能用
QUIT
方法退出,
IE
的
NAVIGETE
方法没有复杂的
POST
参数,但文档对象都可以用同样的方法
引用,大部分事
件和方法也通用
另外,如果访问一个已经存在的网页,例如<
/p>
/
,因为可能产生异
步的延时,所以如果
不是立即窗口,往往根据
READYSTATE
的状态保证网页
加载完毕:
SUB
LOADIE()
‘
在代码的常见的处理情况
Set
ieA
=
CreateObject(
e
=
True
te
/
‘←打开某个网页,要一定时间,但代码会往
下执行
DO
UNTIL
tate=4
‘
检查网
页是否加载完毕(
4
表示完全加载)
DOEVENTS
‘
循环中交回工作权限给系统,以免“软死机”
LOOP
END
SUB
如果对这个
IE
应用程序对象的相关声明和事件感兴趣,
就要引用
I
E
控件找到对象中的常量
和事件:
(M
ICROSOFT INTERNET CONTROL)
你可以看到的是,
通过
ieA
——就是创建的对象——我们可以操
作它,
也可以访问它的属性。
下面继续,
如果前面你是在命令行输入,
打开的那个空白网页没有关闭,
变量是继续有效的:
Set doc = nt
‘取得网页的文档对象
TML =
‘在文档的
BODY
标记内加上标记文字
HELLO
< br>网页上写了一行小字,
HELLO......
通用的惯
例,当然你可以写上其它的什么,
HI
,我爱你,
EXCEL
,
HOME
之类
,但这不是最需要的关心的问题,我们要知道这个对象之下的结构。
< br>从文档对象(
Document
)以下展开的对象模型,
它代表网页的内容,和前面那个
IE
的应用
程序不是同一个体系——请注意这一点——如果我们编程时要用到对应的对象事件和常量,
< br>在
VB/VBA
中要引用的类型库是
(
MIRCOSOFT HTML OBJECT
LIBRARY
)
Documnet
(文档)是文档对象模型的基础,相当于
OFFICE
对象中的
APPLICATION
,取得
Document
之后,
不论修改网页还是读
写网页,还是触发事件,一切都好说,
每个
URL
都对
应有一个
Documnet
(这是假如定成功导航
Navigate
到那个
URL
完成,因此之前要求确定
IE
对象
READSTATE
,以确定对应
URL
的
Document
打开了)
在
Documnet
之下可以取得
documentElement
和
body
两个节点:
......
‘前面
已经取得了
ieA
对象,并打开空白网页,不再重复
set
doc=nt
set
xbody=
‘取得
body
对象
set
xDoc=doc.
documentElement
‘取得根节点
body
前面已经说过,相当于
标记的对象,根节点相当于网页中的
标记元素的对象,
MHTML
的类型库定义里,它
们都属于
HTMLHtmlElement
类型的对象,
下面我把这种类型的对象称为一个“节点”,
不过要注意的是文档对象
不是节点对象,
它是
HTMLDocument
类型。
根节点和
body
节点
不同的是根节点包括整个网页,
在
HTML
的文档
对象模型中,这类对象有几种属性可以取得其中的内容:
对象
.innerHtml
‘对象内部的
HTML
文本
对象
.OuterHtml
‘对象中的
HTML
文本,包括对象本身的
HTML
标记在内
对象
.innerText
‘对象
内部的
TEXT
,不包括
HTML
p>
标记
对象
.OuterText
‘同上,包括对象本身的文本
所以,
如果我们要抓取某个网站的所有
HTML
内容,代码可以这样写
:
......
p>
‘前面已经取得了
ieA
对象,并打开某<
/p>
URL
网页
set
doc=nt
set
xDoc=doc.
documentElement
‘取得根节点
strX=tml
‘取得所有的
HTML
内容
这种取值的方式不妨可以当成
EXCEL
的单元格取值:
set
shDocX=SHEET
‘从应用程序、工作
簿一直定位到当前工作表,这是
EXCEL
的工作簿对象模型
set
rngX=(
“
a1
”
)
‘取得单元格
(
其实不一定是一个格子,
只要是
R
ANGE
类型对象即可
)
X=
‘取得
VALUE
值,也可以取只读的
TEX
T
在网页上看到的标记,就是根节点或
body
之下的标记节点对象(
node
)
< br>。每一个标记节点
对象之下都有一个名为
ChildNo
des
的集合,它包含了“直属于本节点下的标记”,听起来
-
-
-
-
-
-
-
-
-
上一篇:我的家乡观后感600字作文大全
下一篇:试卷模板