楼主 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文档,识别标签,并按标签要求以网页进行显示文本。大部分标签都是成队出现的。 起始标签和结束标签之间的所有文本,都叫做元素。也就是这个格式就是:
另外,注意,元素是可以拥有元素的,即某个元素的内容有时候是一个子元素。 元素这东西,比较抽象,我们可以把它且当作一个对象来理解,例如工作簿对象,每个工作簿的名称都不一样(属性),每个工作簿里面都有工作表(子元素),每个表都有名称(属性),里面填写的内容也不一样(元素的内容)。 下面讲讲常见的和我们网页数据提取要常见的元素/标签。 (一) 整体框架结构: 每个网页文档,都是有个大致的框架,框架如下:
从上面的框架代码,我们可以看出,一般的页面,都有html元素,其一般内含两个元素,一个是head元素,一个是body元素。Head元素仅仅说明文档的相关消息,并不展示文档实体,body元素才是真正展示文档主体的,所有要在页面展示的元素,都要在body內进行书写。 后面的元素的测试,都是以替换掉body元素内的文本“网页文档主体”进行书写,后续不再复述这个框架。 |
2楼 xmyjk |
(二)段落<p> 特别是提取小说,新闻等页面的消息,文本都是一段一段的,这样的页面,一般是通过<p>标签实现的。这个没啥好说的,自己动手试看看就知道。 所以,当运用ie/webbrowser方式提取这类网页的时候,历遍段落p元素即可。 (三)超链接<a> 超链接是我们最常见的页面元素,基本的门户网站都有他,点了以后,可以跳转到另一个页面。一般语法格式:
测试做个ET的超链接吧。 (四)图像<img> 图像标签用法和超链接类似,语法:
我们做个加载ET的LOGO的页面玩玩。( (五)表格<table> 表格是我们网页最常见的,也是我们网页数据提取,最需要打交道的,其实它非常简单,框架如下,每行用<tr>,每个单元格用<td>:
(六)列表 很多时候,数据也经常以列表形式存在的,列表有三种:无序、有序和自定义。分别框架如下: 1、无序列表<ul>
2、有序列表<ol>
3、自定义列表<dl>
|
3楼 xmyjk |
(七)表单和表单控件 除了表格,表单也是我们在网页数据提取,页面操控最常见到的元素。例如我们注册用户,例如我们的微博登陆,例如我们的百度搜索,其实都是表单。我们先来看一个例子:
例如在文本框输入“苹果”后,按提交按钮: 这个表单模拟的是百度搜索,在文本框输入关键字后,按提交,将跳转至百度的搜索结果的界面。呵呵,奇妙吧。如何实现的呢? 细心的同学会发现吧,表单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>) 其语法是:
注意,当表单提交的时候,发送http请求时,单选框和复选框,仅发送checked属性为”checked”的元素。一样是把标记了checked的元素的name属性值和value属性值串起来。 2、下拉列表<select> 其语法:
(八)框架<frame> 标签和<iframe> 标签 1、frameset和frame Frame是独立框架,就好像我们的分屏浏览一样,一个屏幕,浏览多个画面一样。语法如下:
Frame元素的src属性就是设定了其框架内显示页面的URL。示例如下:
2、iframe 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对象的属性和方法等,我们后面的课会再讲:
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(元素)的相关属性和方法。
|
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。
ii.一个常用的通用方法fireevent(发送事件) HTML DOM 对象,和我们EXCEL对象,都具有属性、方法和事件。前面所述的innerhtml那些都是属性,方法就是我们要给这个对象执行什么动作,比如点击网页上一个按钮,按钮这个对象就被“click”了,click就是按钮对象的一个方法。另外,网页对象也像我们的工作表一样,也支持识别事件,例如,当按钮被点击了,系统就会触发“oncilck”(被点击了这个事件),然后依据网页源代码里面设定好处理步骤去处理这个事件。 主要的事件,整理如下: 那fireevent这个方法又是何用呢,他的作用就是,代替我们的一些操作,直接激发某些对象的某些事件。 例如我们附件的fireevent示例.html,点击文档主体的”点我一下”,将弹出对话框。下面,我们用程序模拟,这个点击事件的触发。新建一个excel,放置于和fireevent示例.html同文件夹下的目录里。
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”,然后提交查询为演示吧。
表格对象,也是我们提取网页数据,最常打交道的对象了。其内含rows对象集合,可以使我们访问表格内的每行,每个row对象还内含cells对象集合,使我们可以访问其每行的每个单元格,读取每个单元格的innertext属性即可获取我们所需每个单元格的文本。 另外,常用的属性还有length,这个类似我们VBA里面的count,都是返回某个对象的数量。 我们以提取东方财富网的限售股解禁清单的table为例,URL:http://data.eastmoney.com/dxf/default.html。
|
8楼 xmyjk |
(4)框架frames对象 Frame和iframe元素,均体现在frames对象集合里面。其最重要的属性就是document,也就是获取框架的页面文档。举个例子吧,提取一个网址为:http://www.w3school.com.cn/tiy/loadtext.asp?f=html_iframe的框架里面的图片的URL。
文档中 <a> 标签每出现一次,就会创建 Anchor 对象。 这个就没啥好示例的了,href属性返回被链接的URL,click可以模拟超链接被点击了。 |
9楼 xmyjk |
(6)元素查找模板 实在不懂得用网页元素分析工具的,那VBA里面,怎么实现,查找我们所需要的元素呢? 以上面第三点,http://data.eastmoney.com/dxf/default.html,为例,查找那个table的索引号。
整个查找框架就是类似这样啦,其他元素的查找,也可以模拟这个框架进行改写。 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这个端口,可以使我们非常容易的获取该元素所在的表单。呵呵,分析完毕,可以开始书写代码了。如下:
读取,东方财富网,高管增减持排行榜,的第一页的页面内容,不讲翻页,因为涉及到一些脚本等高级知识,后面的课程再讲,怕消化不了,实在有兴趣的同学,可以站内信联系我。 看了截图,有些人可能要跳起来了,这个我会,不就是个表单嘛。呵呵,请大家用firebug等分析工具看看,呵呵,你错了,每行是一个ul,每行的每个单元格是个li,翻主体教材呵呵,列表,我们有举例过。而且,表头,和表的主体,是两个分割的部分。不是那么好读取的。 首先,我们先读取主体数据吧,用分析工具如图解析: 数据其实都在id为datacont的div里面,div元素的下面的每个ul就是行,ul里面的li就是每个单元格了。这个无非就是历遍,读取Innertext。我们的读取,要撇去最后一列,不要读取那个自选股的就是,无用数据。 那表头怎么办,继续分析: 其实,它是表的主体内容的那个div,上一个兄弟元素ul里面,一样,每个单元格就是一个li。最后,书写代码如下:
|
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楼 老糊涂 |
很强大 |