#html #vba #web-scraping
#HTML #vba #очистка веб-страниц
Вопрос:
Мой код VBA не может выбрать второй выпадающий вариант после выбора первого выпадающего списка. Не уверен, почему загружается один выпадающий список, а второй не отвечает в соответствии с приведенным ниже кодом? Признателен, если вы могли бы помочь исправить это. С уважением
Dim IE As InternetExplorer
Dim HTMLDoc As HTMLDocument
Dim commodityStr As String
Dim commodityObj As HTMLObjectElement
Dim commodityCodes As IHTMLElementCollection
Dim codeCounter As Long
Dim EDateStr As String
Dim EDateObj As HTMLObjectElement
Dim EdateCodes As IHTMLElementCollection
Dim i As Integer
commodityStr = "MADHYA PRADESH"
EDateStr = "REWA"
Set IE = New InternetExplorer
With IE
.Visible = True
.navigate "http://hydro.imd.gov.in/hydrometweb/(S(ryta1dvaec5pg03bdnxa5545))/DistrictRaifall.aspx"
While .Busy Or .readyState <> READYSTATE_COMPLETE: Wend
Set HTMLDoc = IE.document
End With
Set commodityObj = HTMLDoc.getElementById("listItems")
For codeCounter = 0 To commodityObj.Length - 1
If commodityObj(codeCounter).innerText = commodityStr Then
commodityObj.Value = commodityObj(codeCounter).Value
commodityObj.Focus
commodityObj.FireEvent ("onchange")
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
Exit For
End If
Next
Set EDateObj = HTMLDoc.getElementById("DistrictDropDownList")
For codeCounter = 0 To EDateObj.Length - 1
If EDateObj(codeCounter).innerText = EDateStr Then
EDateObj.Value = EDateObj(codeCounter).Value
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
commodityObj.Focus
commodityObj.FireEvent ("onchange")
Exit For
End If
Next
Ответ №1:
Вам нужен временной цикл, позволяющий выполнить это событие onchange. Кроме того, вы можете использовать селекторы css attribute = value для удаления циклов при нацеливании на элементы. Вероятно, страница выполняет запрос XHR, поэтому проверьте с помощью инструментов разработки, чтобы убедиться, что это так.
Option Explicit
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub MakeSelections()
Dim ie As InternetExplorer, ele As Object, t As Date
Const MAX_WAIT_SEC As Long = 5
Dim commodity As String, iDate As String
commodity = "MADHYA PRADESH"
iDate = "REWA"
Set ie = New InternetExplorer
With ie
.Visible = True
.Navigate2 "http://hydro.imd.gov.in/hydrometweb/(S(3qitcijd521egpzhwqq3jk55))/DistrictRaifall.aspx"
While .Busy Or .readyState < 4: DoEvents: Wend
.document.querySelector("[value='" amp; commodity amp; "']").Selected = True
.document.querySelector("[name=listItems]").FireEvent "onchange"
t = Timer
Do
On Error Resume Next
Set ele = .document.querySelector("[value='" amp; iDate amp; "']")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ele Is Nothing
If Not ele Is Nothing Then
ele.Selected = True
.document.querySelector("#GoBtn").Click
Else
Exit Sub
End If
Stop
.Quit
End With
End Sub
Комментарии:
1. Отличный QHarr! Большое спасибо за ваши усилия по исправлению этого.
2. Но моя конечная цель этого кодирования — не нацеливаться на какие-либо конкретные элементы. Но для запуска циклов и извлечения данных всех элементов в форму Excel. Если бы вы могли мне помочь, это было бы очень полезно!. Еще раз большое спасибо за ваше время и усилия.
3. Например, поместите ваши переменные в массивы и выполните циклическое присвоение идентификатору и товару в этих циклах.
4. Спасибо QHarr! Это отличный вклад для меня.