IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

récupéré données html


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Points : 49
    Points
    49
    Par défaut récupéré données html
    Bonjour voilà plusieurs jours que j’essaye d'extraire les résultats de la page https://fr.besoccer.com/competition/ligue_1 mais celle-ci est modifiable par la sélection de la journée dans la combobox (1 -> 38)

    J'ai le début d'un code mais celui-ci me permet de récupérer que les résultats de la dernière journée (J 28)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Public Sub collect_matchs(var_m As Variant)
        Dim matches As Object
        Dim match As Object
        Dim combobox As Object
        Dim i As Integer
        Set codeHTML = get_HTML("competition/ligue_1")
        ' Trouver la combobox qui permet de sélectionner la journée
        Set combobox = codeHTML.getElementsByClassName("select-control mb0")(0)
        'With combobox
        '    .Value = "1"
        '    .setAttribute "selected"
        'End With
        ' Récupérer la liste des matchs de la journée 1
        Set matches = codeHTML.getElementsByClassName("match-link p0")
        ' Boucle à travers les matchs et afficher les résultats
        For Each match In matches
                MsgBox match.innerText
        Next match
    End Sub
    gethtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Public Function get_HTML(suf_url As String) As HTMLDocument
        Dim xmlhttp As Object
        Dim pagehtml As New HTMLDocument
        Dim url As String
        url = base_url & suf_url
        Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
        xmlhttp.Open "GET", url, False
        xmlhttp.send
        If xmlhttp.Status = 200 Then
            writetxt xmlhttp.responseText
            pagehtml.body.innerHTML = xmlhttp.responseText
            Set get_HTML = pagehtml
        Else
            MsgBox "Erreur requête"
        End If
        Set xmlhttp = Nothing
    End Function
    Ma question est de pouvoir faire une boucle sur le nombre de journée pour pouvoir récupérer les différents matchs ?

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut Récupérer données HTML
    Hello,
    le souci, c'est que ton code ne fonctionne que pour des pages "statiques" et en fait sur le site que tu utilises il s'agit de pages générées dynamiquement, c'est à dire que lorsque par exemple on change la sélection de la journée, une requête dynamique ajax va être envoyée au serveur qui va ne renvoyer que le contenu de la page qui change. L'action sur un contrôle HTML comme par exemple une liste déroulante ne peut être effectuée que par un navigateur en utilisant du javascript. Pour cela il y a différentes solutions en VBA comme SeleniumBasic, CDP ou l'objet Internet.Explorer. Mais sur ton site tu as de la chance car on peut aller chercher le contenu qui nous intéresse avec une adresse URL à paramètres du genre :
    fr.besoccer.com/ajax/rounds?id=16&round=1&league=67675&group=1&year=2023&isCompetition=1&competition=16
    où le paramètre round représente la journée. En plus c'est plus rapide que de charger la page entière.
    Voici un code qui :
    - va chercher toutes les pages de la journée 1 à la dernière journée.
    - Affiche la journée, la date des matchs , le match, le score.
    pour la fonction get_html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function get_HTML(suf_url As String) As Object
        Dim xmlhttp As Object
        Dim pagehtml As Object
        Dim url As String
        url = base_url & suf_url
        Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
        Set pagehtml = CreateObject("htmlfile")
        xmlhttp.Open "GET", url, False
        xmlhttp.send
        If xmlhttp.Status = 200 Then
            pagehtml.body.innerHTML = xmlhttp.responseText
            Set get_HTML = pagehtml
        Else
            MsgBox "Erreur requête"
        End If
        Set xmlhttp = Nothing
    End Function
    Pour la procédure collect_matchs()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Public Sub collect_matchs()
        Dim matches As Object
        Dim match As Object
        Dim combobox As Object
        Dim i As Integer, lastRound As Integer
        lastRound = 28
        For i = 1 To lastRound
        Debug.Print "           Journée " & CStr(i)
        Set codeHTML = get_HTML("https://fr.besoccer.com/ajax/rounds?id=16&round=" _
        & CStr(i) & "&league=67675&group=1&year=2023&isCompetition=1&competition=16")
        ' Récupérer la liste des matchs de la journée i
        Set matches = codeHTML.getElementsByClassName("match-link p0")
        ' Boucle à travers les matchs et afficher les résultats
        For Each match In matches
                Debug.Print match.getElementsByClassName("date")(0).innerText _
                & " : " & match.getElementsByClassName("team_left")(0).innerText _
                & " " & match.getElementsByClassName("marker")(0).innerText _
                & " " & match.getElementsByClassName("team_right")(0).innerText
        Next match
        Debug.Print "======================================="
        Next i
        End Sub
    Exemple d'une partie de résultat obtenu :
    Journée 27
    10 MAR 2023 : Lille 3-3 Olympique Lyonnais
    11 MAR 2023 : Auxerre 0-0 Stade Rennais
    11 MAR 2023 : Stade Brestois 1-2 PSG
    12 MAR 2023 : Clermont 0-4 Lens
    12 MAR 2023 : Ajaccio 0-1 Montpellier
    12 MAR 2023 : Angers SCO 0-2 Toulouse
    12 MAR 2023 : Lorient 2-0 Troyes
    12 MAR 2023 : Nantes 2-2 Nice
    12 MAR 2023 : Monaco 0-1 Stade de Reims
    12 MAR 2023 : Olympique Marseille 2-2 Strasbourg
    =======================================
    Journée 28
    17 MAR 2023 : Olympique Lyonnais 1-1 Nantes
    18 MAR 2023 : Toulouse 0-2 Lille
    18 MAR 2023 : Lens 3-0 Angers SCO
    19 MAR 2023 : Ajaccio 0-2 Monaco
    19 MAR 2023 : Montpellier 2-1 Clermont
    19 MAR 2023 : Nice 1-1 Lorient
    19 MAR 2023 : Strasbourg 2-0 Auxerre
    19 MAR 2023 : Troyes 2-2 Stade Brestois
    19 MAR 2023 : PSG 0-2 Stade Rennais
    19 MAR 2023 : Stade de Reims 1-2 Olympique Marseille
    =======================================
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Points : 49
    Points
    49
    Par défaut
    merci pour ton aide J P.

    Pourrais-tu me donner ton cheminement de raisonnement pour apprendre pour le futur. Je suppose que tu utilise l'inspecteur de code.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Il faut utiliser les outils de développement d'un navigateur. Par exemple pour Chrome ( menu Plus d'outils/ Outil de développement). Dans l'onglet Elements on voit toute l'arborescence de la page affichée. Il suffit de trouver les éléments qui nous intéressent et repérer une propriété qui les caractérise ( class, id, name, tag etc ...)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récuper données HTML par CGI
    Par Quartus dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 17/10/2015, 19h03
  2. [Conception] Traitement de donnée (HTML/PHP/MySQL) ?
    Par mohashow dans le forum Langage
    Réponses: 12
    Dernier message: 04/03/2007, 20h17
  3. problème d'extraction de données html
    Par spootnic22 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/11/2006, 13h24
  4. [debutant] recuperer donnée html
    Par drKzs dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 26/06/2006, 20h35
  5. Réponses: 1
    Dernier message: 11/04/2006, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo