VBA очищает HTML от URL с элементами JavaScript - PullRequest
2 голосов
/ 03 июля 2019

Используя следующий код

Sub Test()
'Must have the Microsoft HTML Object Library reference enabled
Dim oHtml As HTMLDocument
Dim oElement As Object
Dim link As String

Set oHtml = New HTMLDocument

With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "https://www.afklcargo.com/WW/en/local/app/index.jsp#/tntdetails/074-26126063", False
    .Send
    oHtml.Body.innerHTML = .responseText
End With

End Sub

Я не могу получить фактический HTML, я полагаю, это потому, что веб-сайт использует Javascript?Как я могу обойти это, чтобы я мог получить свою ценность?

enter image description here

1 Ответ

3 голосов
/ 03 июля 2019

Он динамически добавляется через другой вызов xhr, который вы можете найти на вкладке сети браузера.Поэтому измените свой URL на этот, а затем используйте анализатор json для анализа ответа.

Используйте парсер json, например jsonconverter.bas , для обработки ответа.После установки кода по этой ссылке в стандартный модуль JsonConverter, перейдите в VBE> Инструменты> Ссылки> Добавить ссылку на Microsoft Scripting Runtime.

Вы извлекаете свое значение из json, которое возвращается как метка времени unix.

1561791600000  >  2019-06-29T07:00:00.000Z

Ответ json фактически содержит всю информацию, касающуюся отслеживания.Вы можете изучить его здесь .


Option Explicit

Public Sub Test()
    Dim json As Object

    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        .Open "GET", "https://www.afklcargo.com/resources/tnt/singleAwbDetails?awbId=074-26126063", False
        .send
        Set json = JsonConverter.ParseJson(.responseText)
        Debug.Print json("booking")(1)("arrivalDateLong")("local")
    End With
End Sub

Две функции Шмидта и Навиона для преобразования в дату-время из штампа, скопированного прямо из здесь .

Function Epoch2Date(ByVal E As Currency, Optional msFrac) As Date
    Const Estart As Double = #1/1/1970#
    msFrac = 0
    If E > 10000000000@ Then E = E * 0.001: msFrac = E - Int(E)
    Epoch2Date = Estart + (E - msFrac) / 86400
End Function

Function Epoch2DateS(ByVal epochstamp$) As Date
    Epoch2DateS = CVDate(CDbl(DateSerial(1970, 1, 1)) + Int(Val(epochstamp$) / 1000#) / 86400)
End Function

NB

Использование парсера json - это надежный и рекомендуемый способ, но вы также можете воспользоваться функцией регулярного выражения или split, чтобы получитьзначение.

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