ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 133032|回复: 243

[原创] 网页数据采集---网页文档解析篇(json/html/xml)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-9-27 08:54 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liu-aguang 于 2016-10-18 21:27 编辑

Json/HTML/XML是目前常见的几种数据网页形式, 解析它们(即分离出文档中需要的文本内容)有很多方法.本文主要介绍浏览器自身的解析方式----JavaScriptDomjQuery. 不要被这些新名词吓倒, 套用一本书名的说法: 其实很简单!

目录
一.  重要的基础知识及技巧
     1. 执行JavaScript语句的环境营造
     2. execScript方法和eval函数
     3. 执行JavaScript的全局函数
     4. 执行自定义函数
     5. JavaScript的数组和对象
     6. 将网页文本写入剪贴板—clipboardData对象

二.  Json与Json内容解析
     1. 什么是Json?
     2. 遍历对象或数组的方法
     3. Jsonp解析方法
     4. 数组和对象自身嵌套或相互嵌套的Json/Jsonp实例

三. 基于HTML DOM解析HTML文档
     1.了解HTML基本概念
     2.了解文档对象模型(HTML DOM)
     3 .HTML文档解析
      <1>应用Document对象的方法与属性解析
      <2>应用节点对象的方法与属性解析.
      <3>应用Table对象解析表数据

四. 基于jQuery对象解析HTML文档
    1. 什么是jQuery?
    2. 基本语法---如何获取元素内容
    3. 选择器---如何选择元素
      <1>元素选择器
      <2>属性选择器
      <3>选择器组合
      <4>选择器内包含过滤
      <5>内容选择器
      <6>type选择器
    4.基本的过滤器---如何聚焦指定元素
    一个应用实例
    5. 遍历---更多选择(过滤)HTML元素方法
       <1>jQuery把HTML结构视为家族树
       <2>遍历祖先
       <3>遍历后代
       <4>遍历同胞
       <5>把当前元素包含在选择集合中
       <6>返回距当前元素最近的祖先元素
       <7>将匹配元素集合缩减为指定范围的子集
       <8>对 jQuery 对象进行迭代,为每个匹配元素执行函数

五. XML文档解析
    1. XML文档结构
    2. XML文档的加载
       <1>通过微软的 XML 解析器加载 XML
       <2>通过Microsoft.XMLHTTP, MSXML2.XMLHTTP等组件加载
    3. 利用XML DOM的属性和方法访问元素的文本内容或属性
       <1>利用XML DOM的方法选择XML元素
       <2>利用XML DOM的属性访问元素的文本内容或属性
       <3>访问元素文本内容和属性的两个实例
    4. 定位XML DOM节点
    5. 访问节点总结
    6. 利用xPath查询XML元素

评分

27

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 09:04 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-9-29 10:56 编辑

一.  重要的基础知识及技巧

如今浏览器上看到的网页是如此地酷玄与生动, 这都归功于浏览器中内置的JavaScript. 所有动态网页效果都是浏览器将网页文本转换为文档对象模型(DOM), 通过JavaScript编程实现的. 选择()网页的某内容仅是其中很小一部分功能, 这也就是我们说到的解析”. 换一种说法,VBA中仅为提取网页的某些内容, 并不是一定要系统去学习网页编程的一系列知识. 我们只需掌握为数不多的若干句式与语法就可以做到随心所欲地完成解析工作.

1. 执行JavaScript语句的环境营造
你如果要在EXCEL VBA中执行Word VBA 语句,作法是在EXCEL VBA中执行类似语句:
Set oWord=createobject(“Word.Application”)
然后就可以在oWord(word对象)下执行Word VBA语句了. 同样, 我们要在VBA中执行JavaScript语句或函数可以创建浏览器中的Window(窗口)对象, 这个对象下可以执行JavaScript语句或函数:
Set oDom=CreateObject(“HTMLFILE”)   ‘首先创建HTML Dom(html文档对象模型)
Set oWindow=oDom.parentWindow    ‘然后就可创建Window对象
说明: 这里创建的oDomIE7内置的文档对象模型;  oWindow也是IE7的窗口对象.
在没有加载网页文本之前,现在oDom是一个空文档.

2.     execScript方法和eval函数
执行JavaScript语句, 可以使用Window(窗口)对象的execScrip方法或JavaScripteval全局函数. 两者功能类似, 后者还可以直接返回变量值或计算值.

1: execScript用法
Sub execScript()
    Set oDom= CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oWindow.execScript"var d=new Date();t=d.getTime()" 'JavaScript代码放入双引号内。
    t =oWindow.t  '请重视这种用法: 如何从javaScript执行语句中获得变量值
    MsgBox" 1970/01/01 至今已过去 " & t & " 毫秒"
End Sub
讨论:execScript可执行JavaScriptVbscript代码,默认执行javaScript. javaScript语句之间用分号分隔。
2a: eval用法
Subevala()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow =oDom.parentWindow
    oWindow.execScript"str='abcdef'"  
    strLength =oWindow.eval("str.length")
    MsgBox "字符串str的长度为: "& strLength
End Sub

评分

10

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 09:06 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-10-29 10:02 编辑

2b: eval用法
Sub evalb()
    Set oDom = CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oDom.write"<Script></Script>"
    strLength =oWindow.eval("str='abcdef';str.length")
    MsgBox "字符串str的长度为: "& strLength
End Sub
说明: 在使用Eval函数前, 必须先执行一次execScirpt或者在文档对象中写入至少一个<Script>标签. (在实际解析HTML文档时, 由于文档本身包含若干Script标签,就不必单独再写入了)
特别注意:无论是execScript还是eval,JavaScript代码都是以字符串的形式传递给它们。

例3: 用write方式运行javaScript代码
Sub evalc()
  Set oDom = CreateObject("HTMLFILE")
  Set oWindow = oDom.parentWindow
  oDom.write "<Script>str='abcdef';l=str.length</Script>"
  strLength = oWindow.l
  MsgBox "字符串str的长度为: " & strLength
End Sub
说明: 在HTML文档中, <Script>标签专门设计为包围javaScript脚本, 当用write方式加载至HTML文档对象时, 会自动执行该代码.

3. 执行JavaScript的全局函数

对于JavaScript的全局(顶级)函数,不必使用execScripteval. 可以直接在Window下执行. 比如常用的URL/解码函数encodeURIComponent()/decodeURIComponent(), encodeURI()/decodeURI().

3.1: 把字符“中国”转换为它的URL编码
Sub  GFuna()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oDom.write  "<Script></Script>" '如果文档中已经含Scirpt标签,就不用写入这句.
    stext = "中国"
    MsgBox oWindow.encodeURIComponent(stext)
End Sub
3.2
Sub  GFunb()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oDom.write  "<Script></Script>" '如果文档中已经含Scirpt标签,就不用写入这句.
    stext = "中国"
    MsgBox  oWindow.eval("encodeURIComponent('" & stext & "')")
End Sub

4.执行自定义函数

JavaScript函数与VBA函数意义相近,不过JavaScript无“过程”概念,即使只完成一些动作,不返回值,在VBA中称之为过程,而在javaScript中也叫函数。如:
      不带参数的:
        function a(){var s=5+6;return s}
         功能:计算5+6的值赋给对象s,然后用关键词return返回s到调用处(即函数a返回值为s).
         带参数的:
        functiona(x,y){s=x+y;return s}
说明:上面给出javaScript函数的一般形式,要点:
(1)   关键字function小写;
(2)   参数个数任意;在某些情况下可以没有函数名,叫匿名函数。
(3)   执行的代码用花括号包围;
(4)   如果需要函数返回运算值,用关键字return.

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 09:07 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-10-29 09:04 编辑

4.1
Sub a()
    Set oDom =CreateObject("htmlfile")
    Set oWindow =oDom.parentWindow
    oWindow.execScript "function a(){var s=5+6;return s}"
    MsgBox oWindow.eval("a()")
End Sub

4.2
Sub a1()
    Set oDom =CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oDom.write "<script>function a(){var s=5+6;return s}</script>"
    MsgBox oWindow.eval("a()")
End Sub

4.3
Sub a3()
    b1 = 5
    b2 = 6
    Set oDom =CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oWindow.execScript "function a(x,y){s=x+y;return s}"
    MsgBox oWindow.eval("a(" & b1& "," & b2 & ")")  ‘就是执行函数a(b1,b2)
End Sub

5. JavaScript的数组和对象

(永远记住----JavaScript,变量名/函数名/关键字是大小写敏感的!!!!
在网页解析中,经常用到的基本上就是数组和对象这两个概念.

A.    数组:
定义数组a:
var a=[‘a’,’b’,’c’,1,2,3]
定义空数组a:
var a=[]
说明: (1)方括号; (2)元素间逗号分隔; (3)字符串用单(或双)引号;(4)var是变量类型,可省略的.
读取数组:
(1)   索引法: 如读第一个元素a[0]; 索引号从0开始.
(2)   遍历法: for(k in a){….}
(3)   数组长度: a.length

5.1 索引法
Sub jArr1()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oWindow.execScript"a=['a','b','c',1,2,3];"
    MsgBox oWindow.eval("a[0]")
    MsgBox oWindow.eval("a.length")
End Sub

5.2 遍历法
Sub jArr2()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oWindow.execScript"a=['a','b','c',1,2,3];"
    MsgBox oWindow.eval("s='';for(k in a){s=s+' ' +a[k];};s")
End Sub
说明:
(1)   JavaScript定义字符时,要用单(或双)引号围起来.s=’中国’;s=’’ (定义空字符)
(2)   遍历数组a,k值是索引号,所以真正的值是a[k];
(3)   “+”号对数字来说是算术加;对字符来说是连接符;
(4)   语句间要用分号隔开;
(5)   当有多个变量时Eval永远返回的是最后语句的值.
(6)   请留意for的句式。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 09:08 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-10-29 08:59 编辑

B.    对象
定义对象o: var o={name: ’张三’,sex: ’’, age: 20}
说明:(1)花括号; (2)键(名)和值之间冒号分隔;(3)健值对之间逗号分隔
值读取:
(1)   点号法: 如读取性别o.sex
(2)   遍历法: for(k in o){s=s+’ ‘ +o[k]}

5.3 点号法
Sub jObjA()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oWindow.execScript "o={'name': '张三','xb': '', 'age':20}"
    MsgBox oWindow.o.xb '或下句方法
    MsgBox oWindow.eval("o.name")
End Sub
说明:由于JavaScript对大小敏感,VBA中会将一些关键字的首字母自动转换为大写,所以一般使用第二句方式读取值.
读者可以测试语句 msgboxoWindow.o.Name 将会出错.此处name会自动转换为Name

5.4 遍历法
Sub jObjB()
    Set oDom =CreateObject("HTMLFILE")
    Set oWindow = oDom.parentWindow
    oWindow.execScript "o={name: '张三',xb: '', age:20}"
    MsgBox oWindow.eval("s=''; for(k in o){s=s+' '+o[k]};s")  '遍历值
    MsgBox oWindow.eval("s='';for(k in o){s=s+' '+k};s")       '遍历键
End Sub

6. 将网页文本写入剪贴板—clipboardData对象

一般情况我们可通过msgbox debug.print来查看和分析网页.也可以用Fiddler来记录和查看分析网页. 在这里我们介绍一种把网页内容写入剪贴板, 然后粘贴到记事本中查看的方法.

:
Sub JsonArr()
    Set oHTML =CreateObject("htmlfile")
    Set oWindow = oHTML.parentWindow
    Set http =CreateObject("Msxml2.XMLHTTP")
    http.Open "GET","http://pv.sohu.com/cityjson", False
    http.send
    strHtml = http.responseText
    oWindow.clipboardData.SetData"text", strHtml   ‘这句代码是把文本strHtml写入剪贴板
End Sub
说明:clipboardDataIE中一个对象,有设置,读取或清除方法:
clipboardData.getData(“text”)
clipboardData.clearData “text”
更多相关知识可百度。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 12:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liu-aguang 于 2016-9-27 17:40 编辑

同志们要耐心等哈,每修改一次都要审核半天)半天过去了,内容都不能通过审核;都没有心情写了。

TA的精华主题

TA的得分主题

发表于 2016-9-27 13:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liu-aguang 发表于 2016-9-27 12:07
半天过去了,内容都不能通过审核;都没有心情写了。

着急就先发到附件里吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 13:18 | 显示全部楼层
liucqa 发表于 2016-9-27 13:05
着急就先发到附件里吧

只写了一部分,本想一边写一边修改。

TA的精华主题

TA的得分主题

发表于 2016-9-27 13:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-9-27 13:23 | 显示全部楼层
liu-aguang 发表于 2016-9-27 13:18
只写了一部分,本想一边写一边修改。

现在不能边写边改了,因为审核率貌似接近100%,哈哈
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 14:16 , Processed in 0.043014 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表