Excel vba getElementsByClassName - PullRequest
       66

Excel vba getElementsByClassName

0 голосов
/ 17 февраля 2019

Я пытаюсь очистить дату 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

1 Ответ

0 голосов
/ 17 февраля 2019

Я не могу найти это имя класса в 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 здесь:

enter image description here

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

<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 селекторы
...