有人可以幫我指出正確的方向,讓我的代碼再次運行嗎?“舊方式”通過 VBA 已經作業了很多年,它定期查詢下面的網站以通過 Internet Explorer 收集天氣。但是,現在呼叫 IE 時,它會在 Edge 中打開并且代碼失敗。
我一直在嘗試讓相同的代碼通過 XML v6 作業,并且幾乎成功地使用了“新方式”。我可以加載一個頁面,但我需要在網站上按下按鈕之前將區號輸入到搜索框中的邏輯合并。輸入框是 HTMLDoc.getElementById("keyword"),按鈕是 HTMLDoc.getElementsByTagName("button")。只有在輸入區域并按下按鈕后,才會回傳該區域的天氣。
請問這個查詢可以用新的方式嗎?
我還了解到,這可以通過 Selenium 和 VBA 中的 Web 驅動程式查詢來實作。但是,我聽說每次 Microsoft Edge 更新時,您都需要為 Web 驅動程式下載新的驅動程式,考慮到查詢的基本程度,這似乎有點過頭了。
提前致謝!
詹姆士
老路
//參考:Microsoft Internet Controls、Microsoft HTML Object Library
Dim IE As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLInput As MSHTML.IHTMLElement
Dim HTMLButtons As MSHTML.IHTMLElementCollection
IE.Visible = True
IE.Navigate ("www.bom.gov.au/aviation/forecasts/taf/")
//issue is that ie does not seem to exist, think it is because this actually redirects to edge now so code crashes from this point
Do While IE.ReadyState <> READYSTATE_COMPLETE
Loop
Debug.Print IE.LocationName; IE.LocationURL
Set HTMLDoc = IE.Document
Set HTMLInput = HTMLDoc.getElementById("keyword")
HTMLInput.Value = "20"
Set HTMLButtons = HTMLDoc.getElementsByTagName("button")
HTMLButtons(0).Click
新的方法
//參考:Microsoft XML, v6.0
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
XMLPage.Open "GET", "http://bom.gov.au/aviation/forecasts/taf/", False
XMLPage.send
HTMLDoc.body.innerHTML = XMLPage.responseText
Call ProcessHTMLPage(HTMLDoc)
uj5u.com熱心網友回復:
使用 XMLHTTP,您必須忘記與網頁互動的方式,就像在瀏覽器中一樣,因為內容是靜態的,而現代網站現在大多動態生成其內容。
從 DevTools 檢查網站,似乎搜索觸發了一個 POST 請求,http://www.bom.gov.au/aviation/php/process.php以關鍵字作為回傳結果的資料,因此這是您必須復制的內容。
下面是一個使用YBWP關鍵字的示例代碼(更改常量或適應您的代碼)并將輸出插入到 Sheet1 從 cell 開始A1:
Sub Test()
Const searchKeyWord As String = "YBWP"
Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim requestData As String
requestData = "keyword=" & searchKeyWord & "&type=search&page=TAF"
XMLPage.Open "POST", "http://www.bom.gov.au/aviation/php/process.php", False
XMLPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
XMLPage.send requestData
HTMLDoc.body.innerHTML = XMLPage.responseText
Dim resultColl As Object
Set resultColl = HTMLDoc.getElementsByTagName("p")
Dim i As Long
For i = 0 To resultColl.Length - 1
ThisWorkbook.Worksheets("Sheet1").Cells(i 1, 1).Value = resultColl(i).innerText
Next i
End Sub
運行它將回傳XMLPage.responseText如下:
<h3>WEIPA YBWP</h3><p class="product">TAF YBWP 251217Z 2514/2602<br />10006KT 9999 SCT020<br />RMK<br />T 27 25 25 30 Q 1011 1009 1011 1012</p><p class="product">METAR YBWP 251230Z AUTO 00000KT 9999 // SCT027 SCT033 BKN047 28/24<br />Q1012 RMK RF00.0/000.0</p>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415844.html
標籤:
上一篇:VBA幫助觸發與輸入框相關的事件
