基于VBA/Excel的HTML抽取

基于VBA/Excel的HTML抽取,html,excel,vba,web-scraping,Html,Excel,Vba,Web Scraping,我在17track.net上有以下HTML代码: <div class="tools"> <button type="button" class="btn btn-sm icon fa-copy-files-o waves- effect" data-toggle="tooltip" data-placement="top" data-original-title="Copy detailed tracking results for all numbers." id=

我在17track.net上有以下HTML代码:

 <div class="tools"> <button type="button" class="btn btn-sm icon fa-copy-files-o waves- 
effect" data-toggle="tooltip" data-placement="top" data-original-title="Copy detailed 
 tracking results for all numbers." id="cl-details" data-clipboard-text="Number: 
 LW571320552CN
 Package status: Delivered (26 Days)
 Country: China -> United States
 Destination:
 2020-04-02 13:03, CATAWBA, SC 29704, Delivered, In/At Mailbox -> Your item was delivered in 
 or at the mailbox at 1:03 pm on April 2, 2020 in CATAWBA, SC 29704.
 2020-04-02 08:13, CATAWBA, SC 29704, Out for Delivery
 2020-04-02 08:02, CATAWBA, SC 29704, Arrived at Unit
 2020-04-01 10:59, MID CAROLINA-CHARLOTTE NC DISTRIBUTION CENTER, Arrived at USPS Regional 
 Destination Facility
 2020-03-31 00:00, In Transit to Next Facility
 2020-03-30 10:02, ALBANY NY DISTRIBUTION CENTER, Arrived at USPS Regional Facility
 2020-03-28 09:54, ISC NEW YORK NY(USPS), Processed Through Facility
 2020-03-28 09:54, Origin Post is Preparing Shipment

要搜索的值是属性值的一部分;也就是说,您需要检查该字符串的
.OuterHTML
或特定属性
数据剪贴板文本
值。您不需要在多个节点上进行循环。您可以使用该id专门针对该节点。我还将在节点选择中添加属性名称,以确保属性存在,而不需要对节点进行
hasaAttribute
检查。我还将添加一个小暂停,以确保页面有时间动态检索内容,并检查节点是否实际找到

Option Explicit

Public Sub CheckForPackageStatus()

    Dim ie As New SHDocVw.InternetExplorer

    Set ie = New SHDocVw.InternetExplorer

    With ie

        .Visible = True
        .Navigate2 "https://t.17track.net/en#nums=LW572098229CN"

        Do: DoEvents: Loop While .Busy Or .ReadyState <> READYSTATE_COMPLETE

        Application.Wait Now + TimeSerial(0, 0, 1)

        Dim node As Object

        Set node = .Document.querySelector("#cl-details[data-clipboard-text]")

        If Not node Is Nothing Then
                If InStr(node.getattribute("data-clipboard-text"), "Package status:") > 0 Then
                    ActiveSheet.Cells(1, 1) = "Found it"
                End If
        End If
    End With
End Sub
选项显式
公共子检查程序包()
Dim ie作为新的SHDocVw.InternetExplorer
设置ie=New SHDocVw.InternetExplorer
与ie
.Visible=True
.导航2“https://t.17track.net/en#nums=LW572098229CN"
Do:DoEvents:Loop While.Busy或.ReadyState ReadyState\u COMPLETE
应用程序。立即等待+时间序列(0,0,1)
将节点变暗为对象
Set节点=.Document.querySelector(“#cl详细信息[数据剪贴板文本]”)
如果不是,则节点为空
如果InStr(node.getattribute(“数据剪贴板文本”),“包状态:”)>0,则
ActiveSheet.Cells(1,1)=“找到了”
如果结束
如果结束
以
端接头

太棒了!非常感谢。有没有办法不用打开IE就可以做到这一点?所以我找到了不用打开IE就可以得到responseText的方法,而且看起来速度要快得多,但是responseText似乎不包含我需要的属性/元素。为什么会这样?是否有任何方法可以在不打开IE的情况下以与此类似的方式提取元素信息?检查数据是否未存储在其他位置。但是,我认为如果您希望使用xhr,首先需要从初始url获取适当的cookie,然后查看rest API调用(假设您正在调用)是否会接受这些cookie。不过,我不确定您所说的“存储在别处”是什么意思。响应文本不是站点的完整HTML代码吗?响应文本是静态初始内容。许多现代网页都在浏览器中运行javascript来更新内容——使用初始url是无法做到这一点的。您可以通过开发工具使用“网络”选项卡,查看是否可以捕获该网页为更新内容所做的任何调用。这就是我看到API调用的地方,它返回您要查找的内容。因此,我认为您需要该端点来获取数据,但看起来它并非用于公共用途。
Option Explicit

Public Sub CheckForPackageStatus()

    Dim ie As New SHDocVw.InternetExplorer

    Set ie = New SHDocVw.InternetExplorer

    With ie

        .Visible = True
        .Navigate2 "https://t.17track.net/en#nums=LW572098229CN"

        Do: DoEvents: Loop While .Busy Or .ReadyState <> READYSTATE_COMPLETE

        Application.Wait Now + TimeSerial(0, 0, 1)

        Dim node As Object

        Set node = .Document.querySelector("#cl-details[data-clipboard-text]")

        If Not node Is Nothing Then
                If InStr(node.getattribute("data-clipboard-text"), "Package status:") > 0 Then
                    ActiveSheet.Cells(1, 1) = "Found it"
                End If
        End If
    End With
End Sub