我正试图从紧缩基础上取消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
答案 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:
请注意,元素具有多个(复合)类
<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 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
参考文献: