Так что это немного глупо, но работает.
1) Разбор HTML
Option Explicit
Sub ExtractDeliveryDetails()
Dim Tnx As String, lastrow As Long, i As Long, ie As New InternetExplorer
With ThisWorkbook.Worksheets("Sheet1")
lastrow = .Cells(.Rows.Count, "C").End(xlUp).Row
ie.Visible = True
ie.navigate "www.ups.com"
Do While ie.Busy = True Or ie.readyState <> 4: DoEvents: Loop
For i = 2 To lastrow
Tnx = .Cells(i, 3).Value
ie.document.getElementById("ups-track--qs").Value = Tnx
ie.document.getElementById("ups-tracking-submit").Click
Do While ie.Busy = True Or ie.readyState <> 4: DoEvents: Loop
Application.Wait Now + TimeSerial(0, 0, 3)
ie.document.getElementById("trackNums").Value = Tnx
Dim buttons As Object
Set buttons = ie.document.getElementsByTagName("button")
Dim btn As Object
For Each btn In buttons
If InStr(btn.Value, "Track") > 0 Then
btn.Click
Exit For
End If
Next btn
Do While ie.Busy = True Or ie.readyState <> 4: DoEvents: Loop
Application.Wait Now + TimeSerial(0, 0, 2) '<==alter timings or loop until a value can be set
Dim htmlArray() As String
htmlArray = Split(ie.document.body.innerHTML, "ups-form_label")
.Cells(i, 4) = Trim$(Replace$(Replace$(Split(Replace(Split(htmlArray(1), "<p>")(1), " ", vbNullString), "</p>")(0), Chr(10), vbNullString), vbTab, " "))
.Cells(i, 5) = Trim$(Replace$(Replace$(Split(Replace(Split(htmlArray(2), "<p>")(1), " ", vbNullString), "</p>")(0), Chr(10), vbNullString), vbTab, " "))
Next i
End With
End Sub
2) Использование querySelectorAll для соответствия CSS
Вы также можете использовать querySelectorAll
в конце вместо анализа HTML, как показано ниже:
Dim b As Object 'DispStaticNodeList
Set b = ie.document.querySelectorAll(".ups-form_label ~ p")
Dim dropDate As String, dropLocation As String
dropDate = b.item(0).innerText
dropLocation = b.item(1).innerText
.Cells(i, 4) = dropDate
.Cells(i, 5) = dropLocation
Это потенциально может быть более устойчивым, поскольку вы можете зациклить длину NodeList, используя b.Length, проверяя содержимое на требуемые свойства.
Примечание:
Вы могли бы лучше переписать объект Waits
, чтобы он был Loop Until
(например, установлен ie.document.getElementById("trackNums")
, т. Е. В поле зрения) с указанным тайм-аутом, чтобы исключить возможность бесконечного завершения цикла.
Пример вывода:
Интересная ссылка на NodeList:
- NodeList