[英]Excel VBA getElementsByTagName() only returning the last input
[英]VBA .getElementsByTagName() not returning elements
我正在嘗試閱讀betfair上 EPL的下注數據。 當我運行以下子程序時,elements.Length返回0。
Sub PullBetfair()
' SOCCER
Const soccerEPL As String = "https://www.betfair.com.au/exchange/plus/football/competition/10932509" ' EPL
' DECLARE INTERNET EXPLORER
Dim ie As New InternetExplorer
ie.Visible = False
' NAVIGATE TO URL
ie.navigate soccerEPL
' LOOP UNTIL NAVIGATION COMPLETE
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
' COLLECT HTML DOCUMENT
Dim html As HTMLDocument
Set html = ie.document
' CREATE COLLECTION OF ELEMENTS
Dim elements As IHTMLElementCollection
Set elements = html.getElementsByTagName("section")
Debug.Print elements.Length
ie.Quit
Set ie = Nothing
End Sub
我已經使用這種方法成功地從其他站點(例如ladbrokes)收集了數據,但是在此站點卻沒有。
我在另一個網站上看到一些提及框架的內容。 HTML對我來說是新的,所以我不太理解它在說什么。
我也嘗試過使用.getElementsByClassName來收集元素,但沒有成功。
理想的答案也許可以解釋層次結構,這樣我就可以理解如何深入研究要讀取的表行。
非常感謝
下面使用適當的等待和定時循環測試長度。
Option Explicit
Public Sub TestForTags()
Dim ie As New InternetExplorer, sections As Object, t As Date
Const MAX_WAIT_SEC As Long = 10
With ie
.Visible = True
.Navigate2 "https://www.betfair.com.au/exchange/plus/football/competition/10932509"
While .Busy Or .readyState < 4: DoEvents: Wend
t = Timer
Do
Set sections = ie.document.querySelectorAll("section")
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While sections.Length = 0
Debug.Print sections.Length
Stop '<== Delete me later
'.Quit
End With
End Sub
sections
是一個nodeList,因此For i = 0 To sections.Length -1
.item(i).innerText
For i = 0 To sections.Length -1
被使用,節點由.item(i).innerText
訪問。 您可以切換並使用Set sections = .document.getElementsByTagName("section")
,然后在其上使用“ For Each”。
我不是專家,但是我根據您的代碼苦苦掙扎。 這是我的小調整,它似乎可以正常運行,但不如預期的那樣,如果IE未准備好,代碼將崩潰。 如果您可以結合其他人關於測試IE是否准備就緒的答案,那就太好了。
While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
mHour = Hour(Now())
mMinute = Minute(Now())
mSec = Second(Now()) + 1 'Wait one more second
waitTime = TimeSerial(mHour, mMinute, mSec)
Application.Wait waitTime
Wend
...
Set elements = html.getElementsByTagName("tr")
For i = 1 To elements.Length - 1 '
Debug.Print elements(i).textContent
Next i
我編寫了用於加載頁面的此函數。 有時,我發現頁面無法正確刷新,卡住並且從未真正完成頁面的加載。
它休眠100毫秒,然后檢查頁面是否已加載,如果3秒鍾后頁面仍未完成刷新/加載,則會刷新並重試。
你會這樣使用
ie.navigate "google.com"
waitforietoload ie
這需要在模塊的頂部
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For 32 Bit Systems
#End If
Option Compare Text
然后在模塊的任何地方
Function waitForIEToLoad(ie As InternetExplorer)
Dim times, times2 As Integer
Do While ie.readyState <> READYSTATE_COMPLETE Or ie.Busy
DoEvents
Sleep 100
times = times + 1
If times = 30 Then
ie.Refresh
times2 = times2 + 1
If times2 = 3 Then
Exit Do
End If
End If
Loop
End Function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.