【问题标题】:HTML Extraction through VBA/Excel通过 VBA/Excel 提取 HTML
【发布时间】:2020-04-10 22:55:12
【问题描述】:

我在 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

实际上,我只需要获取包裹状态。我也可以将整个文本粘贴到excel中,然后我可以用VBA解析它。出于某种原因,我的 VBA 代码无法通过简单的抓取来检索它。我是 HTML 新手,所以感谢您的帮助。

 Sub TrackData()

 Dim element As IHTMLElement
 Dim elements As IHTMLElementCollection
 Dim ie As InternetExplorer

 Dim html As HTMLDocument



 Set ie = New InternetExplorer

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

 'Wait until IE has loaded the web page

 Do While ie.readyState <> READYSTATE_COMPLETE


 DoEvents

 Loop

 Set html = ie.document

 Set elements = html.getElementsByClassName("tools")

 Dim count As Long
 Dim erow As Long
 count = 0
 For Each element In elements
 If element.Children = "Package Status:" Then
 Sheets("Stage").Cells(1, 1) = "Found It"
 End If
 Next element



 End Sub

【问题讨论】:

    标签: html excel vba web-scraping


    【解决方案1】:

    您要搜索的值是属性值的一部分;这意味着,您需要检查该字符串的 .OuterHTML 或特定属性 data-clipboard-text 值。您不需要在多个节点上进行循环。您可以使用 id 专门针对该节点。我还将属性名称添加到节点选择中,以确保该属性存在,而无需在节点上进行hasAttribute 检查。我还会添加一个小暂停,以确保页面有时间动态检索内容并检查是否确实找到了节点。

    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
    

    【讨论】:

    • 太棒了!谢谢你。有什么方法可以在不打开 IE 的情况下做到这一点?
    • 所以我找到了如何在不打开IE的情况下获取responseText,而且看起来要快得多,但是responseText似乎没有包含我需要的属性/元素。为什么会这样?有没有办法以类似的方式在不打开 IE 的情况下提取元素信息? stackoverflow.com/questions/47592151/…
    • 检查数据没有存储在其他地方。但是,我认为如果您希望使用 xhr,您首先需要从初始 url 中获取适当的 cookie,然后查看其余 API 调用是否会接受这些 cookie(假设您正在调用 t.17track.net/restapi/track)看起来 API 是用于商业用途:help.17track.net/hc/en-us/articles/…
    • 我不确定您所说的“存储在其他地方”是什么意思。 responstText 不是网站的完整 HTML 代码吗?
    • 响应文本为静态初始内容。许多现代网页在更新内容的浏览器中运行 javascript - 您不会通过使用初始 url 来获得它。您可以通过开发工具使用网络选项卡来查看是否可以捕获网页为更新内容所做的任何调用。这就是我看到返回您所追求的内容的 API 调用的地方。因此,我认为您需要该端点来获取数据,但看起来它不适合公共使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2020-02-06
    • 2013-08-27
    • 2021-10-18
    • 2021-01-19
    • 2019-02-27
    相关资源
    最近更新 更多