gpt4 book ai didi

excel - 提交表单并从网站获取数据VBA

转载 作者:行者123 更新时间:2023-12-02 13:51:52 33 4
gpt4 key购买 nike

我正在尝试从此 site 获取数据在 Excel 中使用 VBA。我尝试做并且有效的方法是使用 InternetExplorer 对象,如下所示:

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "http://zertifikate.finanztreff.de"
IE.document.getElementById("USFsecuritySearchDropDown").Value = "DE000BP5TBQ2"
IE.document.getElementById("USFsecuritySearchDropDownForm").submit

Do While IE.Busy Or IE.readyState <> 4 'wait until page is loaded
Application.Wait DateAdd("s", 1, Now)
Loop
MsgBox IE.document.getElementById("BP5TBQ~30~5").innerHTML

然而,这种方法运行速度非常慢,并且并不总是能得到正确的结果。我怀疑有时它没有等到网页加载。我试图寻找答案,发现this answer on stackoverflow 。现在我试图弄清楚如何使用 MSXML2 和 MSHTML 重写我的宏。到目前为止我能够做到这一点:

Dim IE As MSXML2.XMLHTTP60
Set IE = New MSXML2.XMLHTTP60

IE.Open "GET", "http://zertifikate.finanztreff.de", False
IE.send
While IE.ReadyState <> 4
DoEvents
Wend

Dim HTMLDoc As MSHTML.HTMLDocument
Dim htmlBody As MSHTML.htmlBody

Set HTMLDoc = New MSHTML.HTMLDocument
Set htmlBody = HTMLDoc.body
htmlBody.innerHTML = IE.responseText
HTMLDoc.getElementById("USFsecuritySearchDropDown").Value = "DE000BP5TBQ2"

请问,为什么 HTMLDoc 有 getElementById 方法而 htmlBody 没有?我如何提交表格“USFsecuritySearchDropDownForm”。我试过这个:

 HTMLDoc.getElementById("USFsecuritySearchDropDownForm").submit

,但它总是在我的默认浏览器中打开新窗口,我想将其隐藏。在我看来,我缺少 XMLHTTP60 和 MSHTML.HTMLDocument 之间的区别。如果您能帮助我,或者至少告诉我在哪里可以找到这些信息,我将非常感激......

最佳答案

XMLHTTP 向网络服务器发送 http 请求并接收响应。 MSHTML 接收字符串并呈现 HTML。当您一起使用它们时,XMLHTTP 获取网络服务器响应,MSHTML 将该响应放入您可以使用的表单中。

我认为您不需要提交任何内容。如果您访问该网站并输入股票代码,您会看到类似的页面

http://zertifikate.finanztreff.de/dvt_einzelkurs_uebersicht.htn?seite=zertifikate&i=22558284&suchbegriff=DE000BP5TBQ2&exitPoint=

里面有股票行情。您可以直接“GET”该 URL,并从返回的 html 中获取所需的任何信息。这个例子得到了我假设的股票价格。

Sub GetPrice()

Dim xHttp As MSXML2.XMLHTTP
Dim hDoc As MSHTML.HTMLDocument
Dim hDiv As HTMLDivElement
Dim hTbl As HTMLTable

Const sTICKER As String = "DE000BP5TBQ2"

Set xHttp = New MSXML2.XMLHTTP

xHttp.Open "GET", "http://zertifikate.finanztreff.de/dvt_einzelkurs_uebersicht.htn?seite=zertifikate&i=22558284&suchbegriff=" & sTICKER & "&exitPoint="
xHttp.send

Do Until xHttp.readyState = 4
DoEvents
Loop

If xHttp.Status = 200 Then
Set hDoc = New MSHTML.HTMLDocument
hDoc.body.innerHTML = xHttp.responseText

'Get the third TD in the first TABLE in the first DIV whose class is 'tape'
Set hDiv = hDoc.getElementsByClassName("tape").Item(0)
Set hTbl = hDiv.getElementsByTagName("table").Item(0)
Debug.Print hTbl.getElementsByTagName("td").Item(2).innerText
End If

End Sub

帖子示例

Sub GetPriceByPost()

Dim xHttp As MSXML2.XMLHTTP
Dim hDoc As MSHTML.HTMLDocument
Dim hDiv As HTMLDivElement
Dim hTbl As HTMLTable

Const sTICKER As String = "i=635957"

Set xHttp = New MSXML2.XMLHTTP

xHttp.Open "POST", "http://fonds.finanztreff.de/fonds_einzelkurs_uebersicht.htn"
xHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xHttp.send sTICKER

Do Until xHttp.readyState = 4
DoEvents
Loop

If xHttp.Status = 200 Then
Set hDoc = New MSHTML.HTMLDocument
hDoc.body.innerHTML = xHttp.responseText

'Get the third TD in the first TABLE in the first DIV whose class is 'tape'
Set hDiv = hDoc.getElementsByClassName("tape").Item(0)
Set hTbl = hDiv.getElementsByTagName("table").Item(0)
Debug.Print hTbl.getElementsByTagName("td").Item(2).innerText
Else
Debug.Print xHttp.statusText
End If

End Sub

关于excel - 提交表单并从网站获取数据VBA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173320/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com