Попытка очистить данные - PullRequest
0 голосов
/ 14 июля 2020

Я новичок ie в этом, поэтому пытаюсь получить руководство. Я пытаюсь разработать код на 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, и по какой-то причине я не могу получить доступ к ссылкам, которые, как я считаю, позволят мне сделать это еще путь.

Как еще я могу очистить веб-сайт, чтобы узнать цену опциона?

1 Ответ

1 голос
/ 14 июля 2020

Как и braX написал в своем комментарии, getElementsByClassName() генерирует коллекцию узлов. Элементы коллекции обозначены именами классов 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).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

Более быстрый вариант: Если на странице нет содержимого Dynami c, которое необходимо загрузить, вы можете использовать более быстрый HTTP-запрос xml. Одно ограничение: 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
...