VBA网页抓取内容没有类名或ID

时间:2017-11-10 05:41:02

标签: vba web-scraping getelementsbyclassname

我想从香港交易所获取股息期货价格。

以下是此网站的网址: http://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/HSCEI-Dividend-Futures?sc_lang=en#&product=DHH

我想在" Dec-19合同"中刮取Prev.Day结算价格。通过VBA。 但是,它没有任何类名或ID,所以我不知道如何访问这些信息。

<tr>
  <td>Dec-19</td>
  <td>-</td>
  <td>-</td>
  <td>413.78</td>
  <td>
    -
    <br>
    -
  </td>
  <td>-</td>
  <td>
    -
    <br>
    -
  </td>
    <td>-<td>
    <td>17,330</td>
  </tr>

如何通过VBA刮取这个?

3 个答案:

答案 0 :(得分:0)

使用getElementsByTagName。识别你的,然后按行遍历每一行和每一行。这样的事情。

Dim objTR As IHTMLElement
Dim objTD As IHTMLElement
Dim objTable As IHTMLElement

For Each objTR In objTable.getElementsByTagName("tr")
    For Each objTD In objTR
        'do something with objtd.innerText
    Next objTD
Next objTR

或者如果您喜欢后期绑定,则可以将变量声明为Object。

答案 1 :(得分:0)

找到没有特别标志的特定物品真的是自动化的地狱。但是,我已经编写了这个没有硬编码索引的脚本。给这一点并获得你想要的值:

Sub Hkex_Data()

    Dim IE As New InternetExplorer, html As HTMLDocument
    Dim posts As Object

    With IE
        .Visible = False
        .navigate "http://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/HSCEI-Dividend-Futures?sc_lang=en#&product=DHH"
        Do Until .readyState = READYSTATE_COMPLETE: Loop
        Set html = .document
    End With
    Application.Wait (Now + TimeValue("0:00:05"))

    For Each posts In html.getElementsByClassName("hsirowcon")
        Row = Row + 1: Cells(Row, 1) = posts.NextSibling.NextSibling.FirstChild.innerText
        Cells(Row, 2) = posts.NextSibling.NextSibling.LastChild.innerText
    Next posts

    IE.Quit
End Sub

结果:

19-Dec  17,330

参考添加到库:

Microsoft internet controls
Microsoft Html Object Library

答案 2 :(得分:0)

您也可以简单地使用CSS选择器而不使用循环:

html.querySelectorAll("td:nth-child(4)")(1).innerText

这种方法很脆弱。如果页面上的样式发生变化,则可能会中断。

CSS选择器:

如果您观察到页面的相关部分(显示第一个合同年份,其中包含上下文标题,并且删除了合同年份之间的图表):

Contract info

2019年合约的关联HTML是:

HTML

Prev.Day Settlement Price是此内容中的第4个td,即CSS选择器td:nth-child(4)

此模式在所有合约年份都会重复,因此您可以将所有匹配的nodeList返回给此(即td:nth-child(4)方法的每个.querySelectorAll

2019年是指数位置1;这是基于0的索引nodeList中的第二个元素,因此您可以使用.querySelectorAll("td:nth-child(4)")(1)进行访问。

CSS查询结果 - 前几个结果:

CSS query