Вы хорошо поработали, +1 за усилия, которые вы приложили в этом!
Я бы хотел сделать еще один шаг, если вы не возражаете.
Во-первых, вы должны иметь в виду, что то, что вы видите при проверке элемента в инструментах разработчика вашего браузера, не обязательно то, что вы увидите в источнике HTML страницы.
Действительно, в этом случае, если вы на самом деле щелкните правой кнопкой мыши и просмотрите исходный код страницы, вы не найдете размещенный вами фрагмент HTML. Однако вы найдете его, если осмотрите интересующий элемент.
Это происходит потому, что эта часть кода HTML создается сценарием. Вы найдете этот скрипт в исходном коде страницы внутри тега <script></script>
(например, просто ищите "sunrise"). Этот тег содержит огромную строку и вторую маленькую строку в формате JSON.
Тег script
выглядит следующим образом:
<script charSet="UTF-8">window.__data={"transactionId":"a3520089-63d0-4320-bb6e-c6308b6e820d", ... {"startIndex":0}};window.experience={"connectionSpeed":"4g","deviceClass":"desktop"};</script>
I Для удобства чтения заменили большую часть строки на ...
.
Все необходимые данные находятся в первой строке JSON (window.__data
) между фигурными скобками {...}
. Вам не понадобится вторая строка (window.experience
).
Поэтому в основном вам нужно изолировать эту строку от ответа и затем проанализировать ее, чтобы получить необходимую информацию.
Вы можете проверить структуру строки JSON, используя такой инструмент, как this . Вот как это выглядит:
Чтобы разобрать строку, подобную этой, вам нужно добавить this JSON parser в ваш проект. Следуйте инструкциям по установке, приведенным в ссылке, и вы должны установить go.
. Вам также необходимо добавить следующие ссылки на ваш проект (VBE> Инструменты> Ссылки):
Microsoft XML version 6.0
Microsoft Scripting Runtime
Сказав это, вот как я это сделаю:
Option Explicit
Sub weather()
Dim req As New MSXML2.XMLHTTP60
Dim url As String, data As String, startOfData As String, endOfData As String
Dim dataJSON As Object, day As Object
startOfData = "window.__data=" 'the string of interest starts after this
endOfData = ";window.experience=" 'the string of interest ends before this
url = "https://weather.com/weather/5day/l/2db548c2f0fb03c25c0d5c5520a32877082d295d907b06df5eff91cd140165b9"
With req
.Open "GET", url, False
.send
data = .responseText
End With
data = Mid(data, InStr(1, data, startOfData) + Len(startOfData)) 'isolate the string of interest: step 1
data = Mid(data, 1, InStr(1, data, endOfData) - 1) 'isolate the string of interest: step 2
Set dataJSON = JsonConverter.ParseJson(data)
Set dataJSON = dataJSON("dal")("DailyForecast")("geocode:44.49,-71.57:language:en-US:units:e")("data")("vt1dailyForecast")
For Each day In dataJSON
Debug.Print day("sunrise")
Debug.Print day("day")("narrative")
Debug.Print day("night")("narrative")
Next day
End Sub
В демонстрационных целях вышеприведенный код печатает только восход и рассказ каждого дня в ближайшем окне. Имея в виду структуру JSON и следуя той же логике c, вы можете настроить код для печати того параметра, который вам нужен.
Вот пример вывода: