Excel vba getElementsByClassName

Я пытаюсь получить дату IPO из crunchbase. К сожалению, я получаю ошибку выполнения 1004 «Ошибка, определяемая приложением или объектом». Моя цель - сохранить дату IPO в ячейке A1.

Sub GetIE()
  Dim IE As Object
  Dim URL As String
  Dim myValue As IHTMLElement
  URL = "https://www.crunchbase.com/organization/verastem"
  Set IE = CreateObject("InternetExplorer.Application")
  IE.Visible = True
  IE.Navigate URL
  Do While IE.Busy Or IE.ReadyState <> 4
    DoEvents
  Loop
  Set myValue = IE.Document.getElementsByClassName("post_glass post_micro_glass")(0)
  Range("A1").Value = myValue
  Set IE = Nothing
End Sub

person Kir    schedule 16.02.2019    source источник
comment
Когда я запускаю это, ошибка возникает в stmt Range(A1).Value = myValue. Следовательно, предыдущий stmt Set myValue не смог найти запрошенный элемент. Код должен получить... элемент, который есть. Пожалуйста, ПОКАЖИТЕ/ПОКАЖИТЕ, почему, по вашему мнению, этот элемент присутствует.   -  person donPablo    schedule 17.02.2019


Ответы (1)


Я не могу найти это имя класса в html для этого URL. Вы можете использовать селектор css, который я покажу ниже, который можно очистить с помощью xmlhttp и, таким образом, избежать открытия браузера.

Option Explicit    
Public Sub GetDate()
    Dim html As HTMLDocument
    Set html = New HTMLDocument                  '<  VBE > Tools > References > Microsoft Scripting Runtime
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.crunchbase.com/organization/verastem#section-overview", False
        .send
        html.body.innerHTML = .responseText
    End With
    ActiveSheet.Range("A1") = html.querySelectorAll(".field-type-date.ng-star-inserted").item(1).innerText
End Sub

Если вы не хотите использовать составные классы, вы также можете использовать

ActiveSheet.Range("A1") = html.querySelectorAll("#section-ipo-stock-price .field-type-date").item(1).innerText

Вы можете увидеть соответствующий html здесь:

введите здесь описание изображения

Обратите внимание, что элемент имеет несколько (составных) классов.

<span class="component--field-formatter field-type-date ng-star-inserted" title="Jan 27, 2012">Jan 27, 2012</span>

Есть 3 класса component--field-formatter ; field-type-date и ng-star-inserted. Я использую два из них в сочетании в первом решении, которое я даю. Несколько классов популярны в наши дни из-за универсальности, которую они дают в стиле страницы, например. это позволяет легко переопределять стили. Вы можете прочитать о css специфичности*, чтобы лучше понять это.

Большее количество классов может означать, что код немного менее надежен, поскольку порядок классов может быть изменен, а класс или несколько могут быть удалены. Это было поднято @SIM в комментарии к ответу на другой вопрос о веб-скрейпинге. Таким образом, я предлагаю одно решение с двумя используемыми классами и другое решение только с одним из используемых классов.


В то время как вы получаете ту же дату для этой страницы просто:

ActiveSheet.Range("A1") = html.querySelector("#section-ipo-stock-price .field-type-date").innerText

Я бы не хотел предполагать, что это всегда будет верно, поскольку он берет дату из строки, где написано "Their stock opened".

* https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity

Использованная литература:

  1. querySelectorAll
  2. селекторы CSS
person QHarr    schedule 17.02.2019