Excel VBA doc.querySelectorAll(“ p”)不会捕获/选择所有p元素

时间:2019-09-27 03:10:40

标签: excel vba web-scraping xmlhttprequest

我正在尝试为Excel修复一个计算器,该计算器将从以下网站提取TNT的最新国际附加费率:https://www.tnt.com/express/en_nz/site/shipping-services/fuel-surcharges-apac.html 如您所见,最新的附加费率为15.75%。

我上传的屏幕截图是我要在“ 15.75%”中提取内容的特定p标签。 Webpage screenshot

我有以下VBA代码来测试我是否获得了正确的元素:

Sub GetFuelSurchargeWeb()

    Dim xhr As Object
    Dim doc As MSHTML.HTMLDocument
    Dim table As Object
    Dim tableCell As HTMLHtmlElement
    Dim valCharge As String, url As String, inrText As String, searchTag1 As String, searchTag2 As String, valFrom As String
    Dim i As Integer, tag1Indx As Integer, tag2Indx As Integer, tag3Indx As Integer
    Dim searchTag3 As String
    Dim ObjP As Object

    url = "https://www.tnt.com/express/en_nz/site/shipping-services/fuel-surcharges-apac.html"
    searchTag1 = "FROM"
    searchTag2 = ":"
    searchTag3 = ":"

    On Error GoTo ErrHndlr
    Application.ScreenUpdating = False

    Set xhr = CreateObject("MSXML2.XMLHTTP")

    With xhr
        .Open "GET", url, False
        .send
        If .readyState = 4 And .status = 200 Then
            Set doc = New MSHTML.HTMLDocument
            doc.body.innerHTML = .responseText
        Else
            MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & _
            vbNewLine & "HTTP request status: " & .status
        End If
    End With

    Set ObjP = doc.querySelectorAll("p")
    Debug.Print (ObjP.Length)
    For Each table In ObjP
        Debug.Print (table.innerHTML)
    Next table

当我打印p标签元素的innerHTML时,似乎抓住了第一段的喜欢,例如“周”,“每加仑美元”,“所有服务”,但是跳过了“ 2019年9月23日-29 2019年9月”“ 1.833”“ 15.75%”,即使它们都包含在p标签中。

我才刚刚开始使用VBA,并且对如何获得此值感到困惑。 如果有人可以通过解决方案或替代方法帮助我获得所需的价值,我们将不胜感激。 理想情况下,我希望包含当前一周的元素也为“ 2019年9月23日-2019年9月29日”,但现在仅关注附加费率。

1 个答案:

答案 0 :(得分:1)

该内容是从您未捕获的另一个端点动态检索的。您可以在“网络”标签中找到它。它返回json,所以理想情况下,您将使用jsonconverter.bas之类的json解析器来处理响应并提取感兴趣的值。有问题的端点是https://www.tnt.com/express/getDynamicData.apac.json

从json提取最新数据点的示例

Option Explicit

Public Sub GetData()
    Dim json As Object

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.tnt.com/express/getDynamicData.apac.json", False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .send
        Set json = JsonConverter.ParseJson(.responsetext)("list")(1)
        Debug.Print json("week"), json("weeklyPrice"), json("surcharge")
    End With
End Sub

json库:

我使用jsonconverter.bas。从here下载原始代码,并将其添加到名为jsonConverter的标准模块中。然后,您需要转到VBE>工具>引用>添加对Microsoft脚本运行时的引用。从复制的代码中删除顶部的Attribute行。

在此处浏览json:https://jsoneditoronline.org/?id=7266ab97d0ac463cb934083fc549038b