Excel vba getElementsByClassName
Excel vba getElementsByClassName
我正在尝试从 crunchbase 中抓取 IPO 日期。
不幸的是,我收到运行时错误 1004“应用程序定义或对象定义的错误”。
我的目标是在 A1 单元格中保存 IPO 日期。
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
我在 html 中找不到那个 url 的 class 名字。您可以使用我在下面显示的 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
如果你不想使用复合 classes 那么你也可以使用
ActiveSheet.Range("A1") = html.querySelectorAll("#section-ipo-stock-price .field-type-date").item(1).innerText
你可以在这里看到相关的html:
注意元素有多个(复合)classes
<span class="component--field-formatter field-type-date ng-star-inserted" title="Jan 27, 2012">Jan 27, 2012</span>
有 3 class 个 component--field-formatter
; field-type-date
和 ng-star-inserted
。我在给出的第一个解决方案中结合使用了其中两个。多个 classes 现在很流行,因为它在页面样式中提供了多功能性,例如它允许轻松覆盖样式。您可以阅读 css specificity* 以更好地理解这一点。
更多 classes 可能意味着代码的健壮性稍差,因为 classes 的顺序可能会更改并且 class 或更多可能会被删除。这是@SIM 在对另一个网络抓取问题的回答的评论中提出的。因此,我提供了一个使用了两个 classes 的解决方案,以及另一个只使用了一个 classes 的解决方案。
虽然您确实通过以下方式获得了此页面的相同日期:
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
参考文献:
我正在尝试从 crunchbase 中抓取 IPO 日期。 不幸的是,我收到运行时错误 1004“应用程序定义或对象定义的错误”。 我的目标是在 A1 单元格中保存 IPO 日期。
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
我在 html 中找不到那个 url 的 class 名字。您可以使用我在下面显示的 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
如果你不想使用复合 classes 那么你也可以使用
ActiveSheet.Range("A1") = html.querySelectorAll("#section-ipo-stock-price .field-type-date").item(1).innerText
你可以在这里看到相关的html:
注意元素有多个(复合)classes
<span class="component--field-formatter field-type-date ng-star-inserted" title="Jan 27, 2012">Jan 27, 2012</span>
有 3 class 个 component--field-formatter
; field-type-date
和 ng-star-inserted
。我在给出的第一个解决方案中结合使用了其中两个。多个 classes 现在很流行,因为它在页面样式中提供了多功能性,例如它允许轻松覆盖样式。您可以阅读 css specificity* 以更好地理解这一点。
更多 classes 可能意味着代码的健壮性稍差,因为 classes 的顺序可能会更改并且 class 或更多可能会被删除。这是@SIM 在对另一个网络抓取问题的回答的评论中提出的。因此,我提供了一个使用了两个 classes 的解决方案,以及另一个只使用了一个 classes 的解决方案。
虽然您确实通过以下方式获得了此页面的相同日期:
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
参考文献: