【问题标题】:Excel VBA - Web Scraping - Get Value from HTML Table CellExcel VBA - Web Scraping - 从 HTML 表格单元格中获取值
【发布时间】:2020-10-19 19:25:36
【问题描述】:

我正在尝试创建一个跟踪货运空运单状态的函数。 我在 SO 社区的帮助下创建了以下功能。 我对 HTML 不太熟悉。我使用 GetElementby Tag/ID 等与其他几家航空公司进行了反复试验,结果奏效了。

但是,对于这家特定的航空公司,没有等级名称、标签名称或 ID。 我无法弄清楚如何在附加的image 中获取突出显示的值(所需的值将是顶行中的值,但每次都是同一列)。

有人可以帮我如何在表格中提取“收到”值。

编写的函数大部分都可以工作 用于测试的样品货号 - 59473805

Function FlightStat_VA(cargoNo As Variant) As String

    Const Url = "https://www.virginatlanticcargo.com/gb/en/track/track-your-cargo.html?prefix=932&number="
    Dim dStatCheck$, deliveryStat$, S$
    
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Url & cargoNo & "&track=go", False
        .send
        S = .responseText
    End With
    
    With CreateObject("HTMLFile")
        .write S
        On Error Resume Next


    'Need Help Here     
dStatCheck = UCase(.getElementById("...").getElementsByTagName("...")(0).innerText)
            On Error GoTo 0
            If dStatCheck <> "" Then
                deliveryStat = dStatCheck
            Else
               deliveryStat = "Not Found"
            End If
        End With
        
        FlightStat_VA = deliveryStat
    End Function

【问题讨论】:

  • 您有货号示例吗?
  • @Mech 对不起。我忘了添加样品货号。这是一个 - 59473805。我将编辑问题以包括数字。
  • 你想要最后一个“收到”还是第一个?
  • 我想为这个“收到”。这将是该表中的最后一个条目,因为货物已交付。但基本上我想要的是在该货物编号显示为“已收到”的特定列中获取最新更新事件(顶行)的内部值。例如,如果它是另一个非常新的货号。该表将只有 2 行,跟踪事件按时间倒序显示。 1 个状态在底行显示“货件已预订”。顶行会显示“已在 XYZ24 航班上预订”而不是“已收到”。所以我想要“在 XYZ24 航班上预订”
  • 我更新了我的答案,以便更轻松地更改数据。只需在deliveryStat中修改你想要的内容

标签: excel vba web-scraping


【解决方案1】:

没有任何理由不在 Microsoft HTML 对象库中使用早期绑定的 MSHTML.HTMLDocument,因为 Microsoft 付出了很多钱来确保每个 Excel 产品都提供相同的版本。

然后您可以访问querySelector,这允许通过 css 选择器进行更快的节点匹配。

Option Explicit

Public Sub test()

    Debug.Print getFlightStat_VA("59473805")

End Sub

Public Function getFlightStat_VA(ByVal cargoNo As Variant) As String
    'VBE > Tools > References > Microsoft HTML Object Library
    Const URL As String = "https://www.virginatlanticcargo.com/gb/en/track/track-your-cargo.html?prefix=932&number="
    Dim dStatCheck As String, html As MSHTML.HTMLDocument
     
    Set html = New MSHTML.HTMLDocument
    
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL & cargoNo & "&track=go", False
        .send
        html.body.innerHTML = .responseText
    End With

    On Error Resume Next
    dStatCheck = UCase$(html.querySelector(".searchResults table").Rows(1).Children(3).innerText)
    On Error GoTo 0

    getFlightStat_VA = IIf(dStatCheck <> vbNullString, dStatCheck, "Not Found")
  
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多