我们在实际工作中遇到网站和网页相关往往要涉及到这类问题:如何下载网页数据?网页之间的通讯是怎么实现的、它们能不能被控制等等。分析网页根据不同协变色镜可以用不同的角度去看,如数据流、标记,不过,如果你是用VB/VBA/脚本或其它支持自动化对象(AUTOMATION)的语言编程,有一个值得了解方法是掌握对象模型,将网页视为对象来自行控制,这个方法需要了解的是IE的自动化对象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及标准的文档对象模型(Document) Set ieA = CreateObject("InternetExplorer.Application") 这几行代码的作用是创建一个IE应用程序对象(是的,相当于一个IE应用程序),并打开一个空白的网页。这个网页独立于VBA的应用程序(WORD或EXCEL)之外,事实上,你必须自已关掉它,或者用ieA.Quit下令退出——注意一下,单纯的关闭VBA或SET ieA=nothing是不会退出这个网页的。当然,如果你正在上网并且愿意,在第3行也可以将第3行的字符串替换成一个网站的名字,或者替换成一个你主机中的文档名——比如C:\XXX.HTM,或D:\PIC\XXX.GIF,正如你在IE地址栏输入名称浏览这些文档一样。另一种可选择的方法是直接在VB/VBA的窗体或工作表等宿主上增加一个的WEB BROWS 浏览器控件,也相当于上面的IE应用程序 SUB LOADIE() 如果对这个IE应用程序对象的相关声明和事件感兴趣,就要引用IE控件找到对象中的常量和事件:SHDOCVW.DLL(MICROSOFT INTERNET CONTROL) ...... body前面已经说过,相当于标记的对象,根节点相当于网页中的标记元素的对象,MHTML的类型库定义里,它们都属于HTMLHtmlElement类型的对象,下面我把这种类型的对象称为一个“节点”,不过要注意的是文档对象不是节点对象,它是HTMLDocument类型。根节点和body节点不同的是根节点包括整个网页,在HTML的文档对象模型中,这类对象有几种属性可以取得其中的内容: 对象.innerHtml 对象.OuterHtml 对象.innerText 对象.OuterText 所以,如果我们要抓取某个网站的所有HTML内容,代码可以这样写: ...... 这种取值的方式不妨可以当成EXCEL的单元格取值: set shDocX=APPLICATION.ACTIVEWORK.ACTIVESHEET 在网页上看到的标记,就是根节点或body之下的标记节点对象(node)。每一个标记节点对象之下都有一个名为ChildNodes的集合,它包含了“直属于本节点下的标记”,听起来有点抽象——这么说吧,就象是文件目录,根目录下的子目录…… HELLO
001 在上面的网页例子里,HTML标记是文档的根节点,是Document的Childnodes集合中的一个成员(还是要提请注意,Document不是节点,是另一种类型对象:上一级文档,但它可以有下级节点集合,正如磁盘可以有下级目录,但它本身不是目录),BODY是根节点的ChildNodes集合中的一个成员,而DIV和P两个节点则是BODY的ChildNodes集合中的两个成员,同样也有自已的Childnoes集合——不过我们很直观地可以看到,它们的下级集合是空的。 …….假定你已经用ieA为名的对象浏览了上述网页文件 在VB/VBA/VBS系列的语言中,item是默认方法,可以省略,不过我在这里还是写出来,加深印象。 ……. 虽然任何标记节点都有ALL集合,但我们还是喜欢用DOCUMENT的ALL,原因无它,文档最大,一锅烩的ALL找起来也最合适。 hi,you excel
set tag1=doc.All.item(“myTag”).item(0) 最初在我个人看来,如果网页中的HTML标记已经有了ID,不如用文档对象的getElementById直接返回一个对象更直接,这个方法不需要经过集合: set tag1=doc. getElementById(“myTag”) 不过,ALL集合有一个很方便的特性——至少在初学者看来是很好用的:ID可以挂到ALL集合之下: strX=doc.All.mytag.innerhtml 另一种方法是以标记名为集合,要用到文档对象的getElementsByName方法: set mydivs=doc. getElementsByName(“div”)
(补一小段,特别增加,关于FORMS,某位兄弟,下面真的真的没有了,不要期望我上传实例......)关于文档对象的FORMS集合,因为大部分网页的数据提交都是通过FORM标记提交的,因此FORMS集合在没有网页中FORM标记没有ID标记或ID标记重复的情况下,可以用来区分不同的FORM节点: QUOTE:
Set
myForms=doc.Forms
FORM标记节点代表的对象是很多朋友关心的内容——在网页对象中,它可以发送数据到服务器,使服务器刷新网页(实际上是服务器按某个格式约定发回数据),我们可以把网页的FORM看成是一个远程的函数调用接口,FORM标记中的ACTION指向的URL地址就是函数入口,而FORM标记内的各个INPUT标记节点就是函数的参数,当发出FORM.Submit方法时,就是远程调用函数了,在服务器端,诸如ASP,PHP就是老老实实找FORM的参数,不管你是用GET还是POST:Set frmX=myForms.item(0) QUOTE:
frmX.submit
但它的参数,也就是INPUT标记们怎么办?当然你可以自已修改,访问,唔......如果你分析了已经存在的网页,想从一个空白页面(ABOUT:BLANK)用VBA“凭空”生成FORM和INPUT节点,光凭上面的方法还不够,我们还要“创造节点”(createElement_x)并连入文档对应的位置(appendChild),但这已经是另一个问题了 |
|