我是对此的新手,因此尝试获取一些指导。我正在尝试在VBA中开发一些代码,这些代码将使Yahoo Finance的期权价格上涨。到目前为止,这是我能够汇总的内容:
Option Explicit
Sub Pull_Option_Price()
Dim URL As String
Dim IE As Object
Dim HTML As Object
Dim OptionPrice As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
URL = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
IE.Navigate URL
Do Until IE.ReadyState = 4: DoEvents: Loop
Set HTML = CreateObject("HTMLFile")
Debug.Print HTML.Document.getElementbyClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D
(ib)").innerText
Set IE = Nothing
End Sub
每次运行代码时,都会在以下行中收到运行时错误438:
Debug.Print HTML.Document.getElementbyClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").innerText
从到目前为止在各种论坛上所读的内容来看,我只能将IE版本较低(低于9)使用.getElementsbyClassName
,而我的版本为11,并且出于任何原因,我都无法访问我相信可以让我以另一种方式做到这一点。
我还能如何刮擦网站以获得期权价格?
答案 0 :(得分:1)
就像braX在他的评论getElementsByClassName()
中所写,它生成一个节点集合。集合中的元素由方括号中的css类名区分。每个元素都有一个像数组一样的索引。第一个索引为0。您的节点集合只有一个元素。因此,必须使用索引0才能从集合中获取它。
另一个问题是HTML.Document
。这是行不通的,因为HTML
是您用行Set HTML = CreateObject("HTMLFile")
创建的空html文档,并且您也引用了document
。您可以直接在IE中使用该文档。
右行是:
Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
您可以使用IE,但是速度很慢:
Sub Pull_Option_Price()
Dim url As String
Dim IE As Object
url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate url
Do Until IE.ReadyState = 4: DoEvents: Loop
Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub
更快的选项:
如果没有动态内容需要在页面上加载,则可以使用更快的xml http请求。一个限制是getElementsByClassName()
仅可通过与xhr的早期绑定来工作。因此,您需要对库的以下两个excel引用:
Microsoft HTML对象库
Microsoft XML,v6.0
Sub Pull_Option_Price_xhr()
Dim xhr As MSXML2.XMLHTTP60
Dim htmlDoc As MSHTML.HTMLDocument
Dim url As String
url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
Set xhr = New MSXML2.XMLHTTP60
Set htmlDoc = New MSHTML.HTMLDocument
xhr.Open "GET", url, False
xhr.Send
htmlDoc.body.innerHTML = xhr.responseText
Debug.Print htmlDoc.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub