Excel 试图搜集数据

Excel 试图搜集数据,excel,vba,web-scraping,Excel,Vba,Web Scraping,我是个新手,所以我想得到一些指导。我正试图在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("I

我是个新手,所以我想得到一些指导。我正试图在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
从目前为止我在各种论坛上所读到的内容来看,我只能将
.getElementsbyClassName
与较低的IE版本(低于9)一起使用,而我有版本11,无论出于何种原因,我都无法访问引用,我相信这将允许我以另一种方式进行


还有什么方法可以从网站上获取期权价格呢?

就像braX在评论中写的那样
GetElementsByCassName()
生成一个节点集合。集合的元素由括号中的css类名指定。每个元素都有一个类似于数组中的索引。第一个索引是0。节点集合只有一个元素。因此,必须使用索引0从集合中获取它

另一个问题是
HTML.Document
。这不起作用,因为
HTML
是一个空的HTML文档,您使用
Set HTML=CreateObject(“HTMLFile”)
行创建,并且您也引用了
document
。您可以直接使用IE中的文档

右行是:
Debug.Print IE.Document.getElementsByClassName(“Trsdu(0.3s)Fw(b)Fz(36px)Mb(-4px)D(ib)”)(0)。内部文本

您可以使用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


没有名为
getElementbyClassName
的函数-它是
getElementsByClassName
(复数),因为多个元素可以具有相同的类名。您可以使用Power Query检索该页面。有两个表格显示了摘要栏中的各种信息。@Chris_A如果我的答案解决了您的问题,请将其标记为解决方案。
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