Excel VBA doc.querySelectorAll ("p") не будет перехватывать / выбирать все элементы p - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь исправить калькулятор для Excel, который извлекает самую последнюю международную ставку надбавки за TNT с этого сайта: https://www.tnt.com/express/en_nz/site/shipping-services/fuel-surcharges-apac.html Как вы можете видеть, последняя ставка надбавки составляет 15,75%.

Скриншот, который я загрузил, представляет собой особый тег p, в который я хочу извлечь содержимое из «15.75%». Снимок экрана веб-страницы

У меня есть следующий код 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

Когда я печатаю innerHTML элементов тега p,Похоже, что в первом параграфе «Неделя», «Доллар на галлон», «Все услуги», но затем пропускается «23 сентября 2019 - 29 сентября 2019», «1.833», «15,75%», хотя онивсе они содержатся в тегах p.

Я только начал использовать VBA и не понимаю, как получить это значение.Был бы признателен, если кто-нибудь может помочь мне с решением или альтернативой, чтобы получить значения, которые я хочу.В идеале мне нужен элемент, содержащий текущую неделю, также «23 сентября 2019 года - 29 сентября 2019 года», но сейчас меня интересует только ставка доплаты.

1 Ответ

1 голос
/ 27 сентября 2019

Этот контент динамически извлекается из другой конечной точки, которую вы не захватываете.Вы можете найти его на вкладке сети.Он возвращает json, поэтому в идеале вы должны использовать json-анализатор, такой как jsonconverter.bas, для обработки ответа и извлечения интересующих значений.Рассматриваемая конечная точка: 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.барельеф.Загрузите необработанный код из здесь и добавьте в стандартный модуль jsonConverter.Затем вам нужно перейти VBE> Инструменты> Ссылки> Добавить ссылку в Microsoft Scripting Runtime.Удалите верхнюю строку Attribute из скопированного кода.

Изучите json здесь: https://jsoneditoronline.org/?id=7266ab97d0ac463cb934083fc549038b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...