ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-14 14:01 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liu-aguang 于 2016-10-16 08:07 编辑

2. 基本语法
   
   jQuery对象.动作()
   
   <1>" 动作"函数即是对前面指定的对象(元素)进行增加/修改/删除/读取(或修改)元素内容/读取(或修改)元素某属性等. 如:
   
   text()   读取元素文本内容;
   html()   读取元素文本代码;
   attr('xxxx')   读取元素某个属性
   size() 返回选择元素在文档中的出现的次数,也可以用length()
   ......
   
   <2> jQuery对象是通过$函数来描述的: $('选择器') 如:
   
   <p id='myid' name='test'>这是一个段落</p>
   
   描述id为myid的p元素的jQuery对象,可表示为:
   
   $('#myid')
   
   于是想读取元素p的文本内容(这是一个段落)的完整语句:
    $('#myid').text()

  <3>选择器
   jQuery是用"选择器"来指定某个(些)元素的,其书写语法很丰富,灵活,后续专题讲解.

在VBA中用jQuery解析的一个简单的例子(如果第一次执行出错,请再运行一次):
    Sub jTest()
      Set oDom = CreateObject("htmlfile")
      Set oWindow = oDom.parentWindow
      oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script>"
      oDom.write "<p id='myid' name='test'>这是一个段落</p>"
      MsgBox oDom.DocumentElement.innerHTML  '你可以看到你写入的HTML文档
      MsgBox oWindow.eval("$('#myid').text()")
    End Sub
讨论:
<1>必须用write方法将jQuery库引入;
<2>写入主体语句也可不用write,而采用下列代码形式(注意在写入头部时,写入了一个空<body>标签):
  
  Sub jTest()
    Set oDom = CreateObject("htmlfile")
    oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script><body></body>"
    oDom.body.innerHTML = "<p id='myid'>这是一个段落</p>"
    MsgBox oDom.parentWindow.eval("$('#myid').text()")
  End Sub

<3>你在测试上面代码时,可能遇到一个问题: 第一次执行代码总是报错,而以后都能正常运行了.它的原因是第一次执行代码时,jQuery库下载工作还没有完成, 接着就执行jQuery函数了.而第一次下载的jQuery库会缓存在ie临时目录里,所以再次执行代码就不会再从服务器端下载库,而是直接调用临时目录里的jQuery库.
如果想用jQuery来解析文档, 在实际应用中,可以用"msxml2.xmlhttp"组件,首先把jQuery下载到临时目录中. 即增加下列代码块:

  With CreateObject("msxml2.xmlhttp")
    .Open "GET", "http://www.w3school.com.cn/jquery/jquery.js", False
    .send
  End With


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-14 16:09 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-10-16 20:06 编辑

3.选择器


jQuery可随心所欲地选取元素,就是因为它有一套强大的选择器.

<1>元素选择器: 可以根据元素名(标签名),或者元素名与属性组合来选取元素.例:

A. 根据元素名(标签名)选择元素 如:
$("p") 选取 <p> 元素。

B. 根据元素的ID和calss(类)选择元素. 如:
$(".intro") 选取所有class="intro"的元素.
$("#demo")  选取所有id="demo"的元素.

C. 元素名与id或class组合选择元素.如:
$("p.intro") 选取所有class="intro" 的 <p> 元素。
$("p#demo") 选取所有id="demo" 的 <p> 元素。

例:
HTML文档
<html>
<body>
<h1 class="intro">这是一个标题</h1>
<p>这是第一个段落</p>
<p id="myid" class="intro">这是第二个段落</p>
<p class="intro">这是第三个段落</p>
</body>
</html>

Sub sel()
    Set oDom = CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script><body></body>"
    oDom.body.innerHtml = "<html><body><h1 class='intro'>这是一个标题</h1><p>这是第一个段落</p><p id='myid' class='intro'>这是第二个段落</p><p class='intro'>这是第三个段落</p></body></html>"
    MsgBox oDom.DocumentElement.innerHtml  '你可以看到你写入的HTML文档
    MsgBox oWindow.eval("$('#myid').text()")   'id为"myid"元素的文本内容
    MsgBox oWindow.eval("$('p').size()")       '文档中所有p元素的个数
    MsgBox oWindow.eval("$('.intro').size()")  '文档中所有class为intro为HTML元素个数
    MsgBox oWindow.eval("$('p.intro').size()") 'class为intro的所有p元素.
End Sub

说明:除id外,根据其它元素名或属性来选择元素,得到的都是一个数组,可用过滤器或相应jQuery函数来过滤出某一个元素(后面专题讲).

<2>属性选择器: 可以根据元素的属性来选取元素,如:

$("[href]")          选取所有带有 href 属性的元素。
$("[href='#']")      选取所有带有 href 值等于 "#" 的元素。
$("[href!='#']")     选取所有带有 href 值不等于 "#" 的元素。
$("[href$='.jpg']")  选取所有 href 值以 ".jpg" 结尾的元素。

例:HTML文档
<html>
<body>
<a href="http://finance.ifeng.com/" >财经</a>
<a href="http://news.ifeng.com/" >资讯</a>
</body>
</html>

Sub sel2()
    Set oDom = CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oDom.write "<script  src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
    oDom.body.innerHtml = "<a href='http://news.ifeng.com/'>资讯</a><a href='http://finance.ifeng.com/' >财经</a>"
    MsgBox oWindow.eval("$('[href]').size()")
    MsgBox oWindow.eval("$(""[href='http://news.ifeng.com/']"").eq(0).text()") 'eq()是一个用索引号过滤的函数
    MsgBox oWindow.eval("$(""[href!='http://news.ifeng.com/']"").eq(0).text()") '这个结果出乎意料,貌似不支持该形式.
End Sub

<3>选择器组合
$("div p") 表示div元素内包含的所有p元素. 选择器之间用空格表示包含前辈与后辈关系.
$("th,td,.intro") 表示选择元素名为th,td和类名为intro的所有元素. 选择器之间用逗号分隔,表示所有匹配选择的元素
例: 读取下列HTML代码段内的价格:
<div class="p-price">
<strong class="J_627913" data-price="86.90"><em>&yen;</em><i>86.90</i></strong></div>
  1. Sub 价格()
  2.   Set oDom = CreateObject("htmlfile")
  3.   Set oWindow = oDom.parentWindow
  4.   oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  5.   oDom.body.innerHTML = "<div class='p-price'><strong class='J_627913' data-price='86.90'><em>&yen;</em><i>86.90</i></strong></div>"
  6.   MsgBox oWindow.eval("$('.p-price i').eq(0).text()")
  7. End Sub
复制代码


<4>过滤型选择器


例:HTML文档
<html>
<body>
<h1 class="intro">这是一个标题</h1>
<p>这是第一个段落</p>
<p id="myid" class="intro">这是第二个段落</p>
<p class="intro">这是第三个段落</p>
</body>
</html>

Sub sel3()
    Set oDom = CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script><body></body>"
    oDom.body.innerHtml = "<html><body><h1 class='intro'>这是一个标题</h1><p>这是第一个段落</p><p id='myid' class='intro'>这是第二个段落</p><p class='intro'>这是第三个段落</p></body></html>"
    MsgBox oWindow.eval("$('p:eq(0)').text()")     '第一个p元素. 语法: 冒号eq(索引)    '
    MsgBox oWindow.eval("$('.intro:eq(1)').text()")
    '与上面等价方式
    MsgBox oWindow.eval("$('p').eq(0).text()")
End Sub


<5>内容选择器

jQuery提供了可以根据元素文本内容来选择元素的方法.
语法:
$(":contains('text')")
text 元素文本内容中包含此内容
例:
测试HTML
<html>
<body>
<h1>Welcome to My Homepage</h1>
<p class="intro">My name is Donald</p>
<p>I live in Duckburg</p>
<p>My best friend is Mickey</p>
<div id="choose">
Who is your favourite:
<ul>
<li>Goofy</li>
<li>Mickey</li>
<li>Pluto</li>
</ul>
</div>
</body>
</html>

Sub containsTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><h1>Welcome to My Homepage</h1><p class='intro'>My name is Donald</p><p>I live in Duckburg</p><p>My best friend is Mickey</p><div id='choose'>Who is your favourite:<ul><li>Goofy</li><li>Mickey</li><li>Pluto</li></ul></div></body></html>"
  MsgBox oWindow.eval("$('p:contains(is)').size()")     '文本内容包含"is"的P元素.
  MsgBox oWindow.eval("$('p:contains(is)').eq(0).text()")
End Sub

<6>Type选择器

可根据元素的type值选择元素.
例:HTML文档
<html>
<body>
<form action="">
Name: <input type="text" name="user" />
<br />
Password: <input type="password" name="password" />
<br />
<button type="button">Useless Button</button>
<input type="button" value="Another useless button" />
<br />
<input type="reset" value="Reset" />
<input type="submit" value="Submit" />
<br />
</form>
</body>
</html>

Sub typeTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><form action=''>Name: <input type='text' name='user' /><br />Password: <input type='password' name='password' /><br /><button type='button'>Useless Button</button><input type='button' value='Another useless button' /><br /><input type='reset' value='Reset' /><input type='submit' value='Submit' /><br /></form></body></html>"
  MsgBox oWindow.eval("$(':text').attr('name')")
  MsgBox oWindow.eval("$(':password').attr('name')")
  MsgBox oWindow.eval("$(':reset').val()")
End Sub
更多的选择器可参考:http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp



评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-14 16:16 | 显示全部楼层
4.过滤器


除了通过id选取的元素外,其它通过选择器得到的都是一个集合数组.为了缩小搜索范围,jQuery提供了一组基本的过滤函数:


first()  第一个子节点
last()   最后一个子节点.
eq(i)    用索引i来过滤; 索引从0开始的.
filter() 允许您规定一个标准。不匹配这个标准的元素会被从集合中删除,匹配的元素会被返回
not()    返回不匹配标准的所有元素。

例4.1 HTML文档
<html>
<body>
<h1>欢迎来到我的主页</h1>
<div>
<p>这是 div 中的一个段落。</p>
</div>
<div>
<p>这是 div 中的另一个段落。</p>
</div>
<p>这也是段落。</p>
</html>
</body>

Sub jTest()
    Set oDom = CreateObject("htmlfile")
    oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script><body></body>"
    oDom.body.innerHTML = "<h1>欢迎来到我的主页</h1><div><p>这是 div 中的一个段落。</p></div><div><p>这是 div 中的另一个段落。</p></div><p>这也是段落。</p>"
    MsgBox oDom.parentWindow.eval("$('div p').first().text()")
    MsgBox oDom.parentWindow.eval("$('div p').last().text()")
    MsgBox oDom.parentWindow.eval("$('div p').eq(1).text()")
    MsgBox oDom.parentWindow.eval("$('p').eq(2).text()")
End Sub

例4.2 HTML文档
<h1>欢迎来到我的主页</h1>
<p>我是唐老鸭。</p>
<p class="intro">我住在 Duckburg。</p>
<p class="intro">我爱 Duckburg。</p>
<p>我最好的朋友是 Mickey。</p>

Sub filterT()
    Set oDom = CreateObject("htmlfile")
    oDom.write "<script  src='http://www.w3school.com.cn/jquery/jquery.js'></script><body></body>"
    oDom.body.innerHTML = "<h1>欢迎来到我的主页</h1><p>我是唐老鸭。</p><p class='intro'>我住在 Duckburg。</p><p class='intro'>我爱 Duckburg。</p><p>我最好的朋友是 Mickey。</p>"
    MsgBox oDom.parentWindow.eval("$('p').filter('.intro').eq(0).text()")
    MsgBox oDom.parentWindow.eval("$('p').not('.intro').eq(0).text()")
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-14 21:35 | 显示全部楼层

一个应用实例: 根据ISBN(9787121098284)从缺书网读取该书号对应图书信息

Sub 获取图书信息()
    sURL1 = "http://www.queshu.com/search/?c=9787121098284"  '
    Set xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    Set oDom = CreateObject("htmlfile")
    Set oWindow = oDom.parentWindow
    oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
   
    With xmlhttp
        .Open "GET", sURL1, False
        .send
        stext = .responsetext
    End With
   
    'oWindow.clipBoardData.setData "text", stext '写入剪贴板,粘贴在记事本中查看
    oDom.body.innerhtml = stext
   
    '网页中显示该书号共包含多少种书
    n = Mid(oWindow.eval("$('.main_b_crumbs strong').eq(0).text()"), 2, 1)
    For j = 1 To Val(n) '遍历每图书的各项信息
        
        '读取定价
        jg = oWindow.eval("$('.dingjia').eq(" & j - 1 & ").text()")
        
        '读取作者及出版日期等信息
        pcy = oWindow.eval("$('.left').parent().prev().eq(" & j - 1 & ").text()")
        
        '读取出版社
        cps = oDom.getElementById("class_left").innerText
        
        '读取书名
        sm = oWindow.eval("$('.img120').eq(" & j - 1 & ").attr('alt')")
    Next
   
End Sub


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 09:08 | 显示全部楼层
5. 遍历---更多选择(或聚焦)HTML元素方法

前面介绍了用各种选择器选择HTML元素, 并且用过滤器缩小选择范围的方法. jQuery还另外提供了大量函数用于选择或过滤HTML元素, 它称之为遍历.所谓"遍历",指以选择的某元素为基准,在该元素的上辈,下辈和同辈之间寻找/查询另外一种元素. 这适合当期望查询的元素不好直接用选择器确定时,通过另外一种容易确定的元素来间接选定它.

<1> jQuery把HTML结构视为家族树

在讲述HTML DOM的时候,我们知道节点之间是由父/子/同胞关系构成的一颗树. 在jQuery看来,这颗树不仅仅是这父/子/同胞关系,而是一颗家族树. 下面通过一个实例来理解:


一段HTML文档:
<div>
<ul>
<li><b>品名</b></li>
<li><span>香蕉</span></li>
</ul>
</div>
它的家族树:
捕获.PNG

<2>遍历祖先
parent()      返回被选元素的直接父元素。该方法只会向上一级对 DOM 树进行遍历。
parents()     返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>)。
parentsUntil()返回介于两个给定元素之间的所有祖先元素。

例 parent()
测试HTML文档:
<html>
<head>
</head>
<body>
<div class="ancestors">
  <div style="width:500px;">div (曾祖父)
    <ul>ul (祖父)  
      <li>li (直接父)
        <span>span</span>
      </li>
    </ul>   
  </div>
  <div style="width:500px;">div (祖父)   
    <p>p (直接父)
        <span>span</span>
      </p>
  </div>
</div>
</body>
</html>
  1. Sub parentTest()
  2.   Set oDom = CreateObject("htmlfile")
  3.   Set oWindow = oDom.parentWindow
  4.   oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  5.   oDom.body.innerHTML = "<div class='ancestors'>  <div style='width:500px;'>div (曾祖父)    <ul>ul (祖父)        <li>li (直接父)        <span>span</span>      </li>    </ul>     </div>  <div style='width:500px;'>div (祖父)       <p>p (直接父)        <span>span</span>      </p>   </div></div>"
  6.   MsgBox oWindow.eval("$('span').parent().size()")
  7.   MsgBox oWindow.eval("$('span').parent().eq(0).html()")
  8. End Sub
复制代码


例2 parents()
测试HTML:
<html>
<body class="ancestors">body (曾曾祖父)
  <div style="width:500px;">div (曾祖父)
    <ul>ul (祖父)  
      <li>li (直接父)
        <span>span</span>
      </li>
    </ul>   
  </div>
</body>
</html>
Sub parentsTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='ancestors'>body (曾曾祖父)  <div style='width:500px;'>div (曾祖父)    <ul>ul (祖父)        <li>li (直接父)        <span>span</span>      </li>    </ul>     </div></body></html>"
  MsgBox oWindow.eval("$('span').parents().size()")
  MsgBox oWindow.eval("$('span').parents('ul').eq(0).html()") '您也可以使用可选参数来过滤对祖先元素的搜索。
End Sub

例3 parentsUntil()
测试文档同例2
Sub parentsUTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='ancestors'>body (曾曾祖父)  <div style='width:500px;'>div (曾祖父)    <ul>ul (祖父)        <li>li (直接父)        <span>span</span>      </li>    </ul>     </div></body></html>"
  MsgBox oWindow.eval("$('span').parentsUntil('div').size()")  '元素span与div之间的元素
  MsgBox oWindow.eval("$('span').parentsUntil('div').eq(0).html()")
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 09:40 | 显示全部楼层
<3>遍历后代

children()    返回被选元素的所有直接子元素。该方法只会向下一级对 DOM 树进行遍历.
find()        返回被选元素的后代元素,一路向下直到最后一个后代。
可以用可选参数过滤返回结果.

例 3.1 children()
测试HTML:
<html>
<body>
<div class="descendants" style="width:500px;">div (当前元素)
  <p class="1">p (子)
    <span>span (孙)</span>     
  </p>
  <p class="2">p (子)
    <span>span (孙)</span>
  </p>
</div>
</body>
</html>


Sub childrenTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><div class='descendants' style='width:500px;'>div (当前元素)<p class='1'>p (子)<span>span (孙)</span></p><p class='2'>p (子)<span>span (孙)</span></p> </div></body></html>"
  MsgBox oWindow.eval("$('div').children().size()")
  MsgBox oWindow.eval("$('div').children('p.1').html()") '可以使用可选参数来过滤对子元素的搜索。
End Sub

例3.2 find()
测试HTML同上


Sub findTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><div class='descendants' style='width:500px;'>div (当前元素)<p class='1'>p (子)<span>span (孙)</span></p><p class='2'>p (子)<span>span (孙)</span></p> </div></body></html>"
  MsgBox oWindow.eval("$('div').find('span').size()")
  MsgBox oWindow.eval("$('div').find('span:eq(0)').text()")
  MsgBox oWindow.eval("$('div').find('*').size()") '返回 <div> 的所有后代
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 10:09 | 显示全部楼层
<4> 遍历同胞

有许多有用的方法让我们在 DOM 树进行水平遍历:
siblings()  返回被选元素的所有同胞元素。您也可以使用可选参数来过滤对同胞元素的搜索。
next()      返回被选元素的下一个同胞元素。该方法只返回一个元素。
nextAll()   返回被选元素的所有跟随的同胞元素。
nextUntil() 返回介于两个给定参数之间的所有跟随的同胞元素。
下面三个方法的工作方式与上面的方法类似,只不过方向相反而已:它们返回的是前面的同胞元素(在 DOM 树中沿着同胞元素向后遍历,而不是向前)。
prev()
prevAll()
prevUntil()

例4.1 siblings()
测试HTML:
<html>
<body class="siblings">
<div>div (父)
  <p>p</p>
  <span>span</span>
  <h2>h2</h2>
  <h3>h3</h3>
  <p>p</p>
</div>
</body>
</html>


Sub siblingsTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='siblings'><div>div (父)<p>p</p><span>span</span><h2>h2</h2><h3>h3</h3><p>p</p></div></body></html>"
  MsgBox oWindow.eval("$('h2').siblings().size()")   '返回 <h2> 的所有同胞元素
  MsgBox oWindow.eval("$('h2').siblings('p').size()") '返回属于 <h2> 的同胞元素的所有 <p> 元素
  MsgBox oWindow.eval("$('h2').siblings('p:eq(0)').text()")
End Sub

例4.2 next()
测试HTML同上

Sub siblingsTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='siblings'><div>div (父)<p>p</p><span>span</span><h2>h2</h2><h3>h3</h3><p>p</p></div></body></html>"
  MsgBox oWindow.eval("$('h2').next().text()") '只返回一个元素
End Sub

例4.3 nextAll()
测试HTML同上

Sub nextaTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='siblings'><div>div (父)<p>p</p><span>span</span><h2>h2</h2><h3>h3</h3><p>p</p></div></body></html>"
  MsgBox oWindow.eval("$('h2').nextAll().size()")
  MsgBox oWindow.eval("$('h2').nextAll().eq(0).text()")
End Sub

例4.4 nextUntil()
测试HTML:
<html>
<body class="siblings">
<div>div (父)
  <p>p</p>
  <span>span</span>
  <h2>h2</h2>
  <h3>h3</h3>
  <h4>h4</h4>
  <h5>h5</h5>
  <h6>h6</h6>
  <p>p</p>
</div>
</body>
</html>

Sub nextUTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body class='siblings'><div>div (父)  <p>p</p>  <span>span</span>  <h2>h2</h2>  <h3>h3</h3>  <h4>h4</h4>  <h5>h5</h5>  <h6>h6</h6>  <p>p</p></div></body></html>"
  MsgBox oWindow.eval("$('h2').nextUntil('h6').size()") '返回介于 <h2> 与 <h6> 元素之间的所有同胞元素
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 20:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
<5>把当前元素包含在选择集合中


.andSelf()

例5
测试HTML
<html>
<body>
<ul>
   <li>list item 1</li>
   <li>list item 2</li>
   <li class="third-item">list item 3</li>
   <li>list item 4</li>
   <li>list item 5</li>
</ul>
</body>
</html>


Sub andSelfTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><ul>   <li>list item 1</li>   <li>list item 2</li>   <li class='third-item'>list item 3</li>   <li>list item 4</li>   <li>list item 5</li></ul></body></html>"
  MsgBox oWindow.eval("$('li.third-item').nextAll().size()")
  MsgBox oWindow.eval("$('li.third-item').nextAll().andSelf().size()")
  MsgBox oWindow.eval("$('li.third-item').nextAll().andSelf().eq(0).text()")
End Sub


<6> 返回距当前元素最近的祖先元素


closest() 方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上。


例6
测试HTML
<html>
<body>
  <ul>
    <li><b>Click me!</b></li>
    <li>You can also <b>Click me!</b></li>
  </ul>
</body>
</html>


Sub closestTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body>  <ul> <li><b>Click me!</b></li><li>You can also <b>Click me!</b></li>  </ul></body></html>"
  MsgBox oWindow.eval("$('b').closest('li').html()")
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 20:43 | 显示全部楼层
<7>将匹配元素集合缩减为指定范围的子集。


定义和用法
slice() 把匹配元素集合缩减为指定的指数范围的子集。
语法
.slice(selector,end)
参数
描述
selector
基于 0 的整数值,指示开始选取元素的位置。
如果是负数,则指示从集合末端开始的偏移量。
end
基于 0 的整数值,指示结束选取元素的位置。
如果是负数,则指示从集合末端开始的偏移量。
如果省略,则选取范围会在集合末端结束。

例7.1
HTML文档:
<html>
<body>
<p>This is a paragraph1.</p>
<p>This is a paragraph2.</p>
<p>This is a paragraph3.</p>
<p>This is a paragraph4.</p>
<p>This is a paragraph5.</p>
<p>This is a paragraph6.</p>
</body>
</html>

Sub sliceTest1()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><p>This is a paragraph1.</p><p>This is a paragraph2.</p><p>This is a paragraph3.</p><p>This is a paragraph4.</p><p>This is a paragraph5.</p><p>This is a paragraph6.</p></body></html>"
  MsgBox oWindow.eval("$('p').slice(0,2).size()")
  MsgBox oWindow.eval("$('p').slice(0,2).eq(0).text()")
End Sub

例7.2 HTML文档同上

Sub sliceTest2()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><p>This is a paragraph1.</p><p>This is a paragraph2.</p><p>This is a paragraph3.</p><p>This is a paragraph4.</p><p>This is a paragraph5.</p><p>This is a paragraph6.</p></body></html>"
  MsgBox oWindow.eval("$('p').slice(2).size()")  '如果省略end,则选择直到最后一个p元素
  MsgBox oWindow.eval("$('p').slice(2).eq(0).text()")
End Sub

例7.3HTML文档同上

Sub sliceTest3()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><p>This is a paragraph1.</p><p>This is a paragraph2.</p><p>This is a paragraph3.</p><p>This is a paragraph4.</p><p>This is a paragraph5.</p><p>This is a paragraph6.</p></body></html>"
  MsgBox oWindow.eval("$('p').slice(2,4).size()")  
  MsgBox oWindow.eval("$('p').slice(2,4).eq(0).text()")
End Sub

例7.4 HTML文档同上

Sub sliceTest4()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><body><p>This is a paragraph1.</p><p>This is a paragraph2.</p><p>This is a paragraph3.</p><p>This is a paragraph4.</p><p>This is a paragraph5.</p><p>This is a paragraph6.</p></body></html>"
  MsgBox oWindow.eval("$('p').slice(-2,-1).size()")  
  MsgBox oWindow.eval("$('p').slice(-2,-1).eq(0).text()")
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-16 21:05 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-10-17 08:36 编辑

<8>对 jQuery 对象进行迭代,为每个匹配元素执行函数

定义和用法
each() 方法规定为每个匹配元素规定运行的函数。

语法
$(selector).each(function(index,element))
参数
描述
function(index,element)
必需。为每个匹配元素规定运行的函数。
index - 选择器的 index 位置
element - 当前的元素(也可使用 "this" 选择器)

例:测试HTML文档
<html>
<head>
<body>
<ul>
<li>Coffee</li>
<li>Milk</li>
<li>Soda</li>
</ul>
</body>
</html>

Sub eachTest()
  Set oDom = CreateObject("htmlfile")
  Set oWindow = oDom.parentWindow
  oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
  oDom.body.innerHTML = "<html><head><body><ul><li>Coffee</li><li>Milk</li><li>Soda</li></ul></body></html>"
  MsgBox oWindow.eval("a=[];$('li').each(function(){a.push($(this).text())});a")
End Sub


Sub eachTest1()
Set oDom = CreateObject("htmlfile")
Set oWindow = oDom.parentWindow
oDom.write "<script src='http://ajax.microsoft.com/ajax/jquery/jquery-1.4.min.js'></script><body></body>"
oDom.body.innerHTML = "<html><head><body><ul><li>Coffee</li><li>Milk</li><li>Soda</li></ul></body></html>"
MsgBox oWindow.eval("a=[];$('li').each(function(i,o){if(i!=1){a.push($(o).text())}});a")
End Sub



评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 19:39 , Processed in 0.046261 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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