0
votes

VBA .GETTELSYSBYTAGNAME () ne renvoie pas des éléments

J'essaie de lire les données de paris de l'EPL sur Betfair . Lorsque j'exécute le sous-niveau suivant, les éléments.length retournent 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


2 commentaires

HTML est nouveau pour vous!?, Pourtant, vous sautez dans la gratte des sites Web de paris. Quelle valeur tout cet effort vous donne-t-il?


C'est parce que ReadyState tourne complète (4), tandis que le site Web est toujours en cours de chargement. Fix rapide: Mettez un retard / sommeil là-bas également. Certains sites Web vont altérer entre prêt-même: complet et occupé pendant le chargement. Vous apprenez ces choses lorsque vous devenez plus expérimenté.


3 Réponses :


2
votes

Ce qui suit utilise une attente appropriée et un test de boucle chronométrée pour la longueur. xxx

sections est une nodéliste donc un pour i = 0 à sections.length -1 est utilisé et les nœuds sont accessibles par .Item (i) .innertext . Vous pouvez faire progresser et utiliser Sections = .document.getelementsbytagname ("Section") puis `pour chaque" sur cela.


1 commentaires

Grande bonne chance d'attendre!



0
votes

J'ai écrit cette fonction que j'utilise pour charger des pages. Parfois, j'ai trouvé que la page ne vous rafraîchit pas correctement, est bloquée et ne complète jamais le chargement de la page.

Il dort pour 100 ms puis vérifie si la page est chargée, si elle ne finit pas le rafraîchissement / le chargement après 3 secondes qu'il rafraîchit et essaie à nouveau. p>

Vous l'utiliseriez comme ceci P>

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


0 commentaires

1
votes

Je ne suis pas un expert, mais je me suis effréné en fonction de votre code. C'est mon petit ajustement et il semble fonctionner, mais pas comme prévu que le code s'écrase si c'est-à-dire que c'est pas prêt. Ce serait génial si vous pouviez intégrer les réponses des autres concernant les tests si c'est-à-dire que c'est prêt.

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


0 commentaires