我想从香港交易所获取股息期货价格。
我想在" 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刮取这个?
答案 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选择器:
如果您观察到页面的相关部分(显示第一个合同年份,其中包含上下文标题,并且删除了合同年份之间的图表):
2019年合约的关联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查询结果 - 前几个结果: