Excel VBA getElementsByClassName

时间:2019-02-16 22:19:16

标签: excel vba web-scraping getelementsbyclassname

我正试图从紧缩基础上取消IPO日期。 不幸的是,我收到运行时错误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 :(得分:0)

我在该URL的html中找不到该类名。您可以使用下面显示的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-formatterfield-type-dateng-star-inserted。在给出的第一个解决方案中,我将其中两个结合使用。由于多种样式在页面样式(例如,网页样式)中具有多功能性,因此如今很流行。它允许轻松地覆盖样式。您可以阅读有关CSS specificity *的信息,以更好地理解这一点。

更多的类可能意味着代码的健壮性稍差一些,因为可以更改类的顺序并可以删除一个或多个类。这是@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 selectors