有没有人可以帮我指出正确的方向,让我的代码再次工作?“老方法”已经通过VBA工作了很多年,它通过Internet Explorer定期查询下面的网站来收集天气信息。但是,现在只要调用IE,它就会在Edge中打开,代码就会失败。
我一直在尝试通过XML v6让同样的代码工作,并且在“新方法”上几乎取得了成功。我可以得到一个单一的页面加载,但我需要纳入的逻辑,其中一个区号是输入到搜索框中,然后按下一个按钮在网站上。输入框为HTMLDoc.getElementById(“关键字”),按钮为HTMLDoc.getElementsByTagName(“按钮”)。只有在进入该区域并按下按钮后,才会返回该区域的天气。
可以将此查询设为新方式吗?
我还了解到,使用Selenium和VBA中的web驱动程序查询,这可能是可能的。然而,我听说每次Microsoft Edge获得更新时,你都需要为web驱动程序下载一个新的驱动程序,考虑到查询的基本程度,这似乎有点过头了。
提前感谢!
詹姆斯
老方法
//引用: Microsoft Internet控件、Microsoft HTML对象库
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)发布于 2021-10-25 13:06:18
使用XMLHTTP,您必须忘记与网页的交互,就像在浏览器中一样,因为内容是静态的,而现代网站现在大多是动态生成其内容。
从DevTools查看网站,似乎搜索触发了一个POST请求到http://www.bom.gov.au/aviation/php/process.php,关键字作为返回结果的数据,所以这是你必须复制的。
下面是使用YBWP作为关键字(更改常量或适应您的代码)的示例代码,并从单元格A1开始将输出插入到Sheet1
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://stackoverflow.com/questions/69706344
复制相似问题