ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

   
EH云课堂-专业的职场技能充电站 限时送,魔方网表将Excel变在线系统 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 30015|回复: 157

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

  [复制链接]

ag娱乐平台手机版,Business Insider表示,但企业在努力,计划使其自动驾驶汽车在2021年具备上路条件。本文将简单介绍在开发自动驾驶技术的公司:

  缪暑金介绍,数字化的整个环节分为三个部分:制作域→播出传送域→接收域。如果采用模拟,每一道制作工序都要在不同的环节完成,加、加特效等,效率低、流程太长。如果采用数字化制作播出,节目制作流程就可以减少。 将“中俄威胁”当口头禅了?美新版核战略遭批驳英媒体透露库蒂尼奥因为长途跋涉颇为劳累,可能会缺席周末的联赛。本次国际比赛日,库蒂尼奥为巴西出场170分钟,助球队两连胜。当地时间周三晚上,库蒂尼奥回到英格兰,周四早晨他来到了梅尔伍德训练基地,但未参加训练。周四下午,他前往利物浦当地医院,接受了检查,非常的疲劳,急需休息。

TA的精华主题

TA的得分主题

本帖已被收录到知识树中,索引项:网页交互
本帖最后由 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元素

评分

参与人数 12鲜花 +28 收起 理由
TB肥仔 + 2 优秀作品
mzbao + 2 优秀作品
纳铭m + 2 太强大了
Moneky + 3 感谢帮助
三坛老窖 + 2 优秀作品

查看全部评分

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

评分

参与人数 5鲜花 +10 ag娱乐平台手机版收起 理由
ione_fox + 2 感谢帮助
纳铭m + 2 优秀作品
today0427 + 2 优秀作品
天之雨露 + 2 优秀作品
wormtwo + 2 优秀作品

查看全部评分

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.

评分

参与人数 1鲜花 +2 ag娱乐平台手机版收起 理由
zpy2 + 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的句式。

评分

参与人数 1鲜花 +2 ag娱乐平台手机版收起 理由
samsinn + 2 优秀作品

查看全部评分

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","/pv133bsohu133bcom/cityjson", False
    http.send
    strHtml = http.responseText
    oWindow.clipboardData.SetData"text", strHtml   ‘这句代码是把文本strHtml写入剪贴板
End Sub
说明:clipboardDataIE中一个对象,有设置,读取或清除方法:
clipboardData.getData(“text”)
clipboardData.clearData “text”
更多相关知识可百度。

评分

参与人数 1鲜花 +2 收起 理由
ione_fox + 2 感谢帮助

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-27 12:07 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-9-27 17:40 编辑

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

TA的精华主题

TA的得分主题

发表于 2016-9-27 13:05 | 显示全部楼层
liu-aguang 发表于 2016-9-27 12:07
半天过去了,内容都不能通过审核;都没有心情写了。

着急就先发到附件里吧

TA的精华主题

TA的得分主题

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

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, 2019-3-22 21:48 , Processed in 0.098216 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Wooffice Inc.

   

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

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

快速回复 ag娱乐平台手机版 返回列表
李明博享受免费住院 朴槿惠却得自己掏钱 七问董明珠:银隆问题出在哪 会不会成为她下一站? 牛汇:美俄针锋相对 中东危局或引燃金价 担忧负面影响 以扎克伯格命名的美医院被要求改名 90后升职速度加快 从职场新人升为总监平均用4年 梅西9场欧冠生死战0进球 面对绝杀机会他脚软了 你能活多久?英媒总结全球寿命排行榜九大事实 上海工商:已约谈拼多多经营者 要求立即自查自纠 央行:注册资本低于3000万不可代销互联网黄金 中超最佳阵容:京沪穗王牌组合中场 本土六将上榜 5G全球商用化时代将提前到来? 王曼昱等6国手退出德乒赛 孙颖莎扛起抗日大旗
澳大利亚500万投资签证遇冷 申签人数历史最低 水皮:乐视网现在是一只灰天鹅 退市正常不退才是意外 四川米易县一水塘打捞出5名男童 均已身亡 美国警告:投资委内瑞拉“石油币”违反制裁政策 男子领钥匙准备装修新房 开门发现成“集体宿舍” 被时代抛弃的小霸王游戏机回来了 已非记忆中模样 KPT校园菁英赛重庆站落幕 电工学院甘沅鑫夺冠 男子看昵称“二奶”直播 转完1314元后立马被拉黑 美东北部遭风暴袭击已致2人丧生 数十万人无电可用 皇马喉舌:梅西太耀眼 值得每天为他列一次队 “北斗”发力 动态厘米级定位来了 油价和美股美元的相关性分析
男子遇车祸被1米铁棍贯穿头部 结果大难不死 全球军火销售三成流向中东 印度仍系武器最大进口国 市场续聚焦中美贸易发展 港股未摆脱反复波动局面 4月经济延续稳中向好趋势 供需两侧新动能增长较快 希腊野火肆虐 已致74死170伤 侠客岛:高校性侵悲剧背后 谁把导师权力关进笼子? 26+6+5!四大全明星只剩他 一人一城就这么苦 广厦一战创造两项纪录!福特森期待与辽篮对决 英伟达财报超预期 稳健一如既往 法媒:中国雄安要建未来之城 彰显中国规划能力 俄战机被击落飞行员被杀 普京为何只进行有限报复 人民日报斥美核态势报告为冷战思维:堪比无赖顽症 “梅爸爸”雪夜救治病危孤儿 自己却再没回来 ag娱乐平台手机版