Excel 试图搜集数据
我是个新手,所以我想得到一些指导。我正试图在VBA中开发一些代码,以从雅虎金融(yahoo finance)获取期权价格。以下是迄今为止我能够总结的内容: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
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