簡體   English   中英

VBA .getElementsByTagName()不返回元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM