Web Scraping VBA

Bonjour à tous.

Je souhaiterais créer un outil de web scraping en utilisant VBA.

J'ai déjà commencé à ébaucher quelque chose avec mes piètres connaissances mais je bloque sur l'extraction InnerHTML du texte désiré.

Pouvez-vous me dire comment arriver à sélectionner le texte désiré?

EDIT : j'ai réussi à me débloquer, je fais un point au prochain post. Merci en tous cas !

Bonjour,

tu me sembles bien parti. Qu'est-ce qui te pose problème ?

En fait je n'arrive pas à sélectionner mon texte (les %) comme il faut. Je ne trouve pas la formule qui vaille car il ne s'agit pas du même nombre ou du même caractère à chaque fois.

En gros mon innerHTML est

<td class="center n">3</td>
            <td class="center matchs_av">Guingamp</td>
            <td class="center matchs_av">Lorient</td><td class="matchs_av"><table><tbody><tr><td width="68"><span class="pourcent_vert">56,9 %</span></td><td width="55"></td></tr></tbody></table></td><td class="matchs_av"><table><tbody><tr><td width="31"><span class="pourcent_jaune"></span></td><td width="92"><span class="chiffre_ok">26,3 %</span></td></tr></tbody></table></td><td class="matchs_av"><table><tbody><tr><td width="20"><span class="pourcent_rouge"></span></td><td width="103"><span class="chiffre_ok">16,9 %</span></td></tr></tbody></table></td></tr><tr>

Et à partir de là je voudrais récupérer trois données:

56,9 %

26,3 %

16,9 %

Pour info j'ai déjà réussi à prendre :

Guingamp

Lorient

Comme le montre le code suivant :

the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "center matchs_av") + 18, Len(the_html_toParse))
team_1_3 = Mid(the_html_toParse, 1, InStr(the_html_toParse, "</td>") - 1)
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "center matchs_av") + 18, Len(the_html_toParse))
team_2_3 = Mid(the_html_toParse, 1, InStr(the_html_toParse, "</td>") - 1)

Comment faire pour que je puisse extraire mes trois pourcentages?

Merci pour vos conseils

bonjour,

voici une proposition de code pour l'extrait html que tu as donné.

la variable tp correspond à ton "the_html_toParse"

    ' se positionner sur le bon numéro de centre

    nc = 3    'numéro de centre à chercher
    While nct <> nc ' tant qu'on n'est pas sur le bon numéro de centre
        s1 = InStr(tp, "center n") ' on recherche la chaine centre n
        If s1 > 0 Then 'si on la trouve
            s1 = s1 + 10 's1 début du numéro de centre
            nct = Mid(tp, s1, InStr(tp, "<")) + 0 ' nct = numéro de centre trouvé
            tp = Mid(tp, s1 + 11) ' on ajuste la chaine dans laquelle on recherche
        Else
            MsgBox "centre n " & nc & " non trouvé": Exit Sub
        End If
    Wend
    ' on a trouvé le numéro de centre qui nous intéresse
    ' on démarre la recherche des pourcentages
    For Each Tag In Array("pourcent_vert", "pourcent_rouge", "pourcent_jaune") ' 3 pourcentages à chercher
        s1 = InStr(tp, Tag) ' on se positionne sur le pourcentage désiré
        If s1 > 0 Then
            s1 = s1 + Len(Tag) + 2 'on ajuste la position de recherche du pourcentage
            s2 = InStr(s1, tp, "%</") - 1 ' on recherche la suite de caractères %</
            v = Mid(tp, s2 - 4, 4) ' v= pourcentage recherché
            MsgBox Tag & ":" & v ' affichage du pourcentage recherché
        Else
            MsgBox "tag " & Tag & " non trouvé"
        End If
    Next

Merci pour ton intervention h2.

Malheureusement je n'ai pas accès à mon PC (excel windows) avant lundi du coup je ne pourrais pas tester.

Je te tiens informé la semaine prochaine.

Merci à toi !

J'ai regardé ton code mais ça ne fonctionne pas. Je dois omettre un paramètre ; j'ai une erreur '13' (incompatibilité de type) sur la ligne suivante

  nct = Mid(tp, s1, InStr(tp, "<")) + 0 ' nct = numéro de centre trouvé

Bref, plus généralement, ton code est intéressant sur la recherche du "center n".

Car c'est ce qui numérote les matchs (14 matchs en général). Mais parfois il y a aussi 15 matchs. Du coup je pensais à un loop pour chercher les 14 ou 15 matchs.

Voici le code d'une des pages :

http://www.pronosoft.com/fr/concours/repartition_lotofoot.php?id15=841
    </tr><tr>
            <td class="center n">1</td>
            <td class="center matchs_av">Bastia</td>
            <td class="center matchs_av">Bordeaux</td><td class="matchs_av"><table><tr><td width="47.594158339739"><span class="pourcent_gris"></span></td><td width="76.405841660261"><span class="chiffre_ko">39,7 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="41.820138355111"><span class="pourcent_jaune"></span></td><td width="82.179861644889"><span class="chiffre_ok">34,9 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="30.58570330515"><span class="pourcent_gris"></span></td><td width="93.41429669485"><span class="chiffre_ko">25,5 %</span></td></tr></table></td></tr><tr>
            <td class="center n">2</td>
            <td class="center matchs_av">Evian Thonon</td>
            <td class="center matchs_av">Toulouse</td><td class="matchs_av"><table><tr><td width="49.453162149311"><span class="pourcent_vert"></span></td><td width="74.546837850689"><span class="chiffre_ok">41,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="36.557299096529"><span class="pourcent_gris"></span></td><td width="87.442700903471"><span class="chiffre_ko">30,5 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="33.989538754161"><span class="pourcent_gris"></span></td><td width="90.010461245839"><span class="chiffre_ko">28,3 %</span></td></tr></table></td></tr><tr>
            <td class="center n">3</td>
            <td class="center matchs_av">Guingamp</td>
            <td class="center matchs_av">Lorient</td><td class="matchs_av"><table><tr><td width="68.51871947911"><span class="pourcent_vert">57,1 %</span></td><td width="55.48128052089"></td></tr></table></td><td class="matchs_av"><table><tr><td width="31.492132392838"><span class="pourcent_gris"></span></td><td width="92.507867607162"><span class="chiffre_ko">26,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="19.989148128052"><span class="pourcent_gris"></span></td><td width="104.01085187195"><span class="chiffre_ko">16,7 %</span></td></tr></table></td></tr><tr>
            <td class="center n">4</td>
            <td class="center matchs_av">Montpellier</td>
            <td class="center matchs_av">Nantes</td><td class="matchs_av"><table><tr><td width="59.013482407103"><span class="pourcent_vert"></span></td><td width="64.986517592897"><span class="chiffre_ok">49,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="38.197961196975"><span class="pourcent_gris"></span></td><td width="85.802038803025"><span class="chiffre_ko">31,8 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="22.788556395922"><span class="pourcent_gris"></span></td><td width="101.21144360408"><span class="chiffre_ko">19,0 %</span></td></tr></table></td></tr><tr>
            <td class="center n">5</td>
            <td class="center matchs_av">Real Sociedad</td>
            <td class="center matchs_av">Eibar</td><td class="matchs_av"><table><tr><td width="75.523661753297"><span class="pourcent_vert">62,9 %</span></td><td width="48.476338246703"></td></tr></table></td><td class="matchs_av"><table><tr><td width="25.438324282389"><span class="pourcent_gris"></span></td><td width="98.561675717611"><span class="chiffre_ko">21,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="19.038013964313"><span class="pourcent_gris"></span></td><td width="104.96198603569"><span class="chiffre_ko">15,9 %</span></td></tr></table></td></tr><tr>
            <td class="center n">6</td>
            <td class="center matchs_av">Villarreal</td>
            <td class="center matchs_av">Levante</td><td class="matchs_av"><table><tr><td width="100.10318949343"><span class="pourcent_vert">83,4 %</span></td><td width="23.896810506567"></td></tr></table></td><td class="matchs_av"><table><tr><td width="12.382739212008"><span class="pourcent_gris"></span></td><td width="111.61726078799"><span class="chiffre_ko">10,3 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="7.5140712945591"><span class="pourcent_gris"></span></td><td width="116.48592870544"><span class="chiffre_ko">6,26 %</span></td></tr></table></td></tr><tr>
            <td class="center n">7</td>
            <td class="center matchs_av">Lazio Rome</td>
            <td class="center matchs_av">Milan AC</td><td class="matchs_av"><table><tr><td width="48.46849207389"><span class="pourcent_vert"></span></td><td width="75.53150792611"><span class="chiffre_ok">40,4 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="40.387789859819"><span class="pourcent_gris"></span></td><td width="83.612210140181"><span class="chiffre_ko">33,7 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="31.143718066291"><span class="pourcent_gris"></span></td><td width="92.856281933709"><span class="chiffre_ko">26,0 %</span></td></tr></table></td></tr><tr>
            <td class="center n">8</td>
            <td class="center matchs_av">Lyon</td>
            <td class="center matchs_av">Metz</td><td class="matchs_av"><table><tr><td width="104.90602409639"><span class="pourcent_vert">87,4 %</span></td><td width="19.093975903614"></td></tr></table></td><td class="matchs_av"><table><tr><td width="10.149397590361"><span class="pourcent_gris"></span></td><td width="113.85060240964"><span class="chiffre_ko">8,46 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="4.944578313253"><span class="pourcent_gris"></span></td><td width="119.05542168675"><span class="chiffre_ko">4,12 %</span></td></tr></table></td></tr><tr>
            <td class="center n">9</td>
            <td class="center matchs_av">Rennes</td>
            <td class="center matchs_av">Caen</td><td class="matchs_av"><table><tr><td width="72.514925373134"><span class="pourcent_gris">60,4 %</span></td><td width="51.485074626866"></td></tr></table></td><td class="matchs_av"><table><tr><td width="28.388059701493"><span class="pourcent_gris"></span></td><td width="95.611940298507"><span class="chiffre_ko">23,7 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="19.097014925373"><span class="pourcent_rouge"></span></td><td width="104.90298507463"><span class="chiffre_ok">15,9 %</span></td></tr></table></td></tr><tr>
            <td class="center n">10</td>
            <td class="center matchs_av">Reims</td>
            <td class="center matchs_av">Lens</td><td class="matchs_av"><table><tr><td width="57.797150041911"><span class="pourcent_gris"></span></td><td width="66.202849958089"><span class="chiffre_ko">48,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="35.346186085499"><span class="pourcent_jaune"></span></td><td width="88.653813914501"><span class="chiffre_ok">29,5 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="26.85666387259"><span class="pourcent_gris"></span></td><td width="97.14333612741"><span class="chiffre_ko">22,4 %</span></td></tr></table></td></tr><tr>
            <td class="center n">11</td>
            <td class="center matchs_av">Sampdoria</td>
            <td class="center matchs_av">Palerme</td><td class="matchs_av"><table><tr><td width="72.996555683123"><span class="pourcent_gris">60,8 %</span></td><td width="51.003444316877"></td></tr></table></td><td class="matchs_av"><table><tr><td width="27.485648679679"><span class="pourcent_jaune"></span></td><td width="96.514351320321"><span class="chiffre_ok">22,9 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="19.517795637199"><span class="pourcent_gris"></span></td><td width="104.4822043628"><span class="chiffre_ko">16,3 %</span></td></tr></table></td></tr><tr>
            <td class="center n">12</td>
            <td class="center matchs_av">Fiorentina</td>
            <td class="center matchs_av">AS Rome</td><td class="matchs_av"><table><tr><td width="33.050193050193"><span class="pourcent_gris"></span></td><td width="90.949806949807"><span class="chiffre_ko">27,5 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="39.907335907336"><span class="pourcent_jaune"></span></td><td width="84.092664092664"><span class="chiffre_ok">33,3 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="47.042471042471"><span class="pourcent_gris"></span></td><td width="76.957528957529"><span class="chiffre_ko">39,2 %</span></td></tr></table></td></tr><tr>
            <td class="center n">13</td>
            <td class="center matchs_av">AthleticBilbao</td>
            <td class="center matchs_av">Malaga</td><td class="matchs_av"><table><tr><td width="55.482502651113"><span class="pourcent_gris"></span></td><td width="68.517497348887"><span class="chiffre_ko">46,2 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="36.43690349947"><span class="pourcent_jaune"></span></td><td width="87.56309650053"><span class="chiffre_ok">30,4 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="28.080593849417"><span class="pourcent_gris"></span></td><td width="95.919406150583"><span class="chiffre_ko">23,4 %</span></td></tr></table></td></tr><tr>
            <td class="center n">14</td>
            <td class="center matchs_av">FC Valence</td>
            <td class="center matchs_av">FC Séville</td><td class="matchs_av"><table><tr><td width="60.963172804533"><span class="pourcent_vert">50,8 %</span></td><td width="63.036827195467"></td></tr></table></td><td class="matchs_av"><table><tr><td width="32.785646836638"><span class="pourcent_gris"></span></td><td width="91.214353163362"><span class="chiffre_ko">27,3 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="26.251180358829"><span class="pourcent_gris"></span></td><td width="97.748819641171"><span class="chiffre_ko">21,9 %</span></td></tr></table></td></tr><tr>
            <td class="center n">15</td>
            <td class="center matchs_av">St Etienne</td>
            <td class="center matchs_av">Paris SG</td><td class="matchs_av"><table><tr><td width="28.034822320537"><span class="pourcent_gris"></span></td><td width="95.965177679463"><span class="chiffre_ko">23,4 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="38.173255316112"><span class="pourcent_gris"></span></td><td width="85.826744683888"><span class="chiffre_ko">31,8 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="53.791922363351"><span class="pourcent_vert"></span></td><td width="70.208077636649"><span class="chiffre_ok">44,8 %</span></td></tr></table></td></tr><tr><td class="total" colspan="6"></td></tr><tr><td colspan="3" class="center"><span class="title_maj bold">Total&nbsp;:</span></td><td class="matchs_av"><table><tr><td width="62.294680781121"><span class="pourcent_vert">51,9 %</span></td><td width="61.705319218879"></td></tr></table></td><td class="matchs_av"><table><tr><td width="31.66325453415"><span class="pourcent_jaune"></span></td><td width="92.33674546585"><span class="chiffre_ok">26,4 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="26.042064684729"><span class="pourcent_rouge"></span></td><td width="97.957935315271"><span class="chiffre_ok">21,7 %</span></td></tr></table></td></tr></table></div>

J'ai réussi à trouvé la bonne formule pour prendre la partie de texte qui m'intéresse

'GAME_1

'extract équipes du match_1
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "center matchs_av") + 18, Len(the_html_toParse))
team_1_1 = Mid(the_html_toParse, 1, InStr(the_html_toParse, "</td>") - 1)
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "center matchs_av") + 18, Len(the_html_toParse))
team_2_1 = Mid(the_html_toParse, 1, InStr(the_html_toParse, "</td>") - 1)

'extract répartition du match_1
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "%</span>") - 5, Len(the_html_toParse))
percent_1_1 = Mid(the_html_toParse, 1, 6)
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "%</span>") - 5, Len(the_html_toParse))
percent_N_1 = Mid(the_html_toParse, 1, 6)
the_html_toParse = Mid(the_html_toParse, InStr(the_html_toParse, "%</span>") - 5, Len(the_html_toParse))
percent_2_1 = Mid(the_html_toParse, 1, 6)

'affichage des équipes du match_1
UserForm1.TextBox2.Text = team_1_1
UserForm1.TextBox3.Text = team_2_1

'affichage répartition du match_1
UserForm1.TextBox4.Text = percent_1_1
UserForm1.TextBox5.Text = percent_N_1
UserForm1.TextBox6.Text = percent_2_1

Cependant j'obtiens toujours le premier pourcentage (69%) à partir de

<td class="center n">1</td>
            <td class="center matchs_av">Chelsea</td>
            <td class="center matchs_av">Liverpool</td><td class="matchs_av"><table><tr><td width="82.787652011225"><span class="pourcent_vert">69,0 %</span></td><td width="41.212347988775"></td></tr></table></td><td class="matchs_av"><table><tr><td width="23.124415341441"><span class="pourcent_jaune"></span></td><td width="100.87558465856"><span class="chiffre_ok">19,3 %</span></td></tr></table></td><td class="matchs_av"><table><tr><td width="14.087932647334"><span class="pourcent_rouge"></span></td><td width="109.91206735267"><span class="chiffre_ok">11,7 %</span></td></tr></table></td></tr><tr>

Comment faire pour obtenir les % suivants?

Bonjour,

une version corrigée :à tester

Sub test()
    Dim données(15, 5)

the_start:
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Top = 0
    objIE.Left = 0
    objIE.Width = 800
    objIE.Height = 600
    objIE.Visible = False
    grid_number = 841   'pour le test
    objIE.Navigate ("http://www.pronosoft.com/fr/concours/repartition_lotofoot.php?id15=" & grid_number)

    'WebBrowser1.Navigate ("http://www.pronosoft.com/fr/concours/repartition_lotofoot.php?id15=" & grid_number)

    Do
        DoEvents
        If Err.Number <> 0 Then
            objIE.Quit
            Set objIE = Nothing
            GoTo the_start:
        End If

    Loop Until objIE.ReadyState = 4

    the_html_toparse = objIE.Document.Body.InnerHTML

    ' se positionner sur le bon numéro de centre
    nct = 0
    For nc = 1 To 15  'numéro de centre à chercher
        While nct <> nc    ' tant qu'on n'est pas sur le bon numéro de centre
            s1 = InStr(the_html_toparse, "center n")    ' on recherche la chaine centre n
            If s1 > 0 Then    'si on la trouve
                s1 = s1 + 10    's1 début du numéro de centre
                nct = Val(Mid(the_html_toparse, s1, InStr(the_html_toparse, "<") - 1)) ' nct = numéro de centre trouvé
                the_html_toparse = Mid(the_html_toparse, s1 + 11)    ' on ajuste la chaine dans laquelle on recherche
            Else
                MsgBox "centre n " & nc & " non trouvé": Exit Sub
            End If
        Wend
        ' on démarre la recherche des équipes
        s1 = InStr(the_html_toparse, "center matchs_av")
        If s1 > 0 Then
            cd = 1
            données(nc, cd) = Mid(the_html_toparse, s1 + 18, InStr(the_html_toparse, "</td>") - s1 - 18)
            the_html_toparse = Mid(the_html_toparse, s1 + 18)
            s1 = InStr(the_html_toparse, "center matchs_av")
            If s1 > 0 Then
                cd = cd + 1
                données(nc, cd) = Mid(the_html_toparse, s1 + 18, InStr(s1 + 18, the_html_toparse, "</td>") - s1 - 18)

                ' on a trouvé le numéro de centre qui nous intéresse
                ' on démarre la recherche des pourcentages
                For Each Tag In Array("pourcent_vert", "pourcent_rouge", "pourcent_jaune")    ' 3 pourcentages à chercher
                    s1 = InStr(the_html_toparse, Tag)    ' on se positionne sur le pourcentage désiré
                    If s1 > 0 Then
                        s1 = s1 + Len(Tag) + 2    'on ajuste la position de recherche du pourcentage
                        s2 = InStr(s1, the_html_toparse, "%</") - 1    ' on recherche la suite de caractères %</
                        cd = cd + 1
                        données(nc, cd) = Mid(the_html_toparse, s2 - 4, 4)   ' v= pourcentage recherché
                    Else
                        MsgBox "tag " & Tag & " non trouvé"
                    End If
                Next
            Else
                'MsgBox "équipe 2 non trouvée"
            End If
        Else
            'MsgBox "équipe 1 non trouvée"
        End If
    Next nc
    For i = 1 To 15
        For j = 1 To 5
            UserForm1("textbox" & (i - 1) * 15 + j) = données(i, j) ' on charge les textboxes avec les données trouvées.
        Next j
    Next i
End Sub

salut h2, merci pour ton intervention.

j'ai run ton code, mais j'ai un bug sur la dernière ligne

UserForm1("TextBox1" & (i - 1) * 15 + j) = données(i, j) 

je ne sais pas quoi faire

flobble a écrit :

salut h2, merci pour ton intervention.

j'ai run ton code, mais j'ai un bug sur la dernière ligne

UserForm1("TextBox1" & (i - 1) * 15 + j) = données(i, j) 

je ne sais pas quoi faire

Bonsoir,

quelques bugs qui restaient sur la mise à jour de tes textboxes par ma macro précédente.

voici la version corrigée + implémentée en pj.

Function GoToGrid_ByGridNumber(grid_number As String)

    GoToGrid_ByGridNumber = ""
 Dim données(15, 5)
    If grid_number = "" Then Exit Function

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Top = 0
    objIE.Left = 0
    objIE.Width = 800
    objIE.Height = 600
    objIE.Visible = False

    objIE.Navigate ("http://www.pronosoft.com/fr/concours/repartition_lotofoot.php?id15=" & grid_number)

the_start:
    Do
        DoEvents
        If Err.Number <> 0 Then
            objIE.Quit
            Set objIE = Nothing
            GoTo the_start:
        End If

    Loop Until objIE.ReadyState = 4

    the_html_toparse = objIE.Document.Body.InnerHTML

    ' se positionner sur le bon numéro de centre
    nct = 0
    For nc = 1 To 15  'numéro de centre à chercher
        While nct <> nc    ' tant qu'on n'est pas sur le bon numéro de centre
            s1 = InStr(the_html_toparse, "center n")    ' on recherche la chaine centre n
            If s1 > 0 Then    'si on la trouve
                s1 = s1 + 10    's1 début du numéro de centre
                nct = Val(Mid(the_html_toparse, s1, InStr(the_html_toparse, "<") - 1)) ' nct = numéro de centre trouvé
                the_html_toparse = Mid(the_html_toparse, s1 + 11)    ' on ajuste la chaine dans laquelle on recherche
            Else
                MsgBox "centre n " & nc & " non trouvé": Exit Function
            End If
        Wend
        ' on démarre la recherche des équipes
        s1 = InStr(the_html_toparse, "center matchs_av")
        If s1 > 0 Then
            cd = 1
            données(nc, cd) = Mid(the_html_toparse, s1 + 18, InStr(the_html_toparse, "</td>") - s1 - 18)
            the_html_toparse = Mid(the_html_toparse, s1 + 18)
            s1 = InStr(the_html_toparse, "center matchs_av")
            If s1 > 0 Then
                cd = cd + 1
                données(nc, cd) = Mid(the_html_toparse, s1 + 18, InStr(s1 + 18, the_html_toparse, "</td>") - s1 - 18)

                ' on a trouvé le numéro de centre qui nous intéresse
                ' on démarre la recherche des pourcentages
                For Each Tag In Array("pourcent_vert", "pourcent_rouge", "pourcent_jaune")    ' 3 pourcentages à chercher
                    s1 = InStr(the_html_toparse, Tag)    ' on se positionne sur le pourcentage désiré
                    If s1 > 0 Then
                        s1 = s1 + Len(Tag) + 2    'on ajuste la position de recherche du pourcentage
                        s2 = InStr(s1, the_html_toparse, "%</") - 1    ' on recherche la suite de caractères %</
                        cd = cd + 1
                        données(nc, cd) = Mid(the_html_toparse, s2 - 4, 4)   ' v= pourcentage recherché
                    Else
                        MsgBox "tag " & Tag & " non trouvé": Exit Function
                    End If
                Next
            Else
                'MsgBox "équipe 2 non trouvée"
            End If
        Else
            'MsgBox "équipe 1 non trouvée"
        End If
    Next nc
    For i = 1 To 15
        For j = 1 To 5
            UserForm1("textbox" & (i - 1) * 5 + j + 1) = données(i, j)
        Next j
    Next i
End Function

mon dernier message a été édité. j'ai ai ajouté une correction et joint un fichier.

Finalement j'ai réussi à extraire mes données très facilement en utilisant la méthode getElementsByTagName.

cependant je bloque maintenant à extraire une donnée qui est en javascript.

puis_je utiliser la méthode getElementsByName?

bonjour,

tout dépend de la manière dont la page est codée. As-tu essayé ?

non car je ne sais pas comment faire. la page est :

http://www.pronosoft.com/fr/concours/repartition_lotofoot.php

et je voudrais toujours extraire la ligne qui contient "selected" :

<option value="848">Grille n&deg;16 du 11/02/15</option>
<option selected="selected" value="847">Grille n&deg;15 du 10/02/15</option>

Bonsoir,

ici comme il n'y a pas de "name" pour cette partie du code, je ne crois pas que ce soit possible.

Bonsoir, bonsoir !

Si c'est possible mais faut dire qu'avec ce malheureux bout de code incomplet je dirais non aussi ‼

En regardant le code de la page (en sachant utiliser un navigateur), l'élément parent disposant d'un ID et d'un nom,

il est alors pas difficile d'extraire le texte de l'élément recherché !

Depuis le début, ce sujet manque de clarté ! Quelle voie est retenue pour extraire les données ? J'en ai au moins quatre …

Dont la simple fonction de feuille de calculs du menu Données via l'icône à partir du Web

permettant de récupérer les données de la page Web sans code à chaque ouverture du classeur, si, si !

Et puis si un code est nécessaire, en activant le Générateur de macros … Cette fonction est en VBA une QueryTable

Est-ce si difficile d'expliquer clairement la donnée à extraire à partir de l'affichage de la page ?

C'est comme pour les % vu qu'ils sont dans une table lignes par colonnes comme une plage de cellules d'Excel,

est-ce vraiment insurmontable d'indiquer une position ligne, colonne ?!

Avec une présentation initiale digne de ce nom, avec tenants et aboutissants, cela aurait été bouclé le jour même, le 23 janvier …

Avec les fonctions texte de base du VBA (InStr, Mid, …) ce n'est pas vraiment du Web Scraping (quel titre ambitieux !)

mais simplement du découpage de texte mais à la limite de l'usine … (ne pas oublier la fonction VBA Split !)

Tandis qu'avec des fonctions Web c'est bien plus simple, enfin un peu moins qu'en utilisant une QueryTable (pour les %) …

Bonsoir flobbie,

je ne maitrise pas le modèle DOM

mais voir ci-dessous comment accéder à la grille sélectionnée dans ta page HTML. Il y a sûrement moyen d'être plus efficace, mais bon ceci fonctionne.

Sub test()
    GoToGrid_ByGridNumber 841
End Sub
Function GoToGrid_ByGridNumber(grid_number As String)

    GoToGrid_ByGridNumber = ""
    Dim données(15, 5)
    If grid_number = "" Then Exit Function

    Set objie = CreateObject("InternetExplorer.Application")
    objie.Top = 0
    objie.Left = 0
    objie.Width = 800
    objie.Height = 600
    objie.Visible = False

    objie.Navigate ("http://www.pronosoft.com/fr/concours/repartition_lotofoot.php?id15=" & grid_number)

the_start:
    Do
        DoEvents
        If Err.Number <> 0 Then
            objie.Quit
            Set objie = Nothing
            GoTo the_start:
        End If

    Loop Until objie.ReadyState = 4
    Set doc = objie.Document
    Set el = doc.getelementsbyname("select")
    Set sl = el.Item(0)
    For i = 0 To sl.Length - 1
        Set v = sl.Item(i)
        vv = v.Text
            Set a = v.Attributes.Item(161)
            aa = a.Name
            If aa = "selected" Then If a.Value = "selected" Then MsgBox vv & " est sélectionnée"
    Next i

End Function

J'ai une erreur 5 avec le code précédent mais je n'ai pas cherché à comprendre car cela peut dépendre de la version d'IE

comme de celle de Windows ! Par exemple un code sans souci sous Seven et IE9 peut ne pas fonctionner

sous Seven et IE10 mais ce même code avec IE10 peut se dérouler sans problème sous Windows 8 !

Pour revenir sur mon précédent message, à cause des soucis selon les versions et selon des recommandations officielles,

j'ai pris l'habitude de cibler un élément disposant d'un ID. Même sans maitriser le modèle DOM,

il suffit de pointer une variable sur l'élément pour visualiser sa structure dans la fenêtre des Variables locales

Là c'est vrai l'élément disposant d'un nom :

Sub Demo1()
    T! = Timer

    With CreateObject("InternetExplorer.Application")
        .Navigate "http://www.pronosoft.com/fr/concours/repartition_lotofoot.php"
        While .Busy Or .ReadyState < 4:  DoEvents:  Wend

        With .Document.getElementsByTagName("Select")(0)
            MsgBox "Demo 1 :  " & Format(Timer - T, "0.000s") & vbLf & vbLf & _
                   .Item(.selectedIndex).innerText
        End With

        .Quit
    End With
End Sub

Pour extraire des données d'une source HTML, souvent le pire est d'utiliser des fonctions

manipulant du texte à partir du code source de la page HTML comme au début de ce sujet !

Quoique pour une seule donnée à extraire via la fonction Split ce n'est pas difficile …

Ensuite un peu moins pire mais pas terrible non plus est de piloter Internet Explorer

notamment à cause de sa lenteur et de ses contraintes …

La solution intermédiaire et un peu plus rapide est d'utiliser l'objet VBA QueryTable comme évoqué précédemment.

A partir de son icône depuis une feuille de calculs, l'intégralité des données d'une page ou d'une table peut

être récupérée et même mise à jour automatiquement à l'ouverture du classeur et ce, sans code ‼

Ici aucun souci avec les % mais l'information de cet élément Select ne l'est pas …

Enfin le plus rapide est de reproduire la requête utilisée par un navigateur ou dans ce cas,

charger localement la page HTML pour en extraire la donnée :

Sub Demo2()
    T! = Timer

    With CreateObject("MSXML2.XMLHttp")
        .Open "POST", "http://www.pronosoft.com/fr/concours/repartition_lotofoot.php", False
        On Error Resume Next
        .Send
        On Error GoTo 0
        If .Status = 200 Then S$ = .responseText
    End With

    If S > "" Then
        With CreateObject("HTMLFile")
            .Write S

            With .getElementsByTagName("Select")(0)
                MsgBox "Demo 2 :  " & Format(Timer - T, "0.000s") & vbLf & vbLf & _
                       .Item(.selectedIndex).innerText
            End With
        End With
    End If
End Sub

N'utiliser des variables de type objet que si nécessaire (car inutile pour les utiliser qu'une fois !)

et ne pas oublier de les libérer en fin de procédure : Set VarObj = Nothing

Voilà maintenant vous disposez de la matière pour coder efficace !


Un problème sans solution est un problème mal posé. (Albert Einstein)

Bonjour Marc,

il suffit de pointer une variable sur l'élément pour visualiser sa structure dans la fenêtre des Variables locales …

merci pour cette astuce, je n'avais pas pensé que cela pouvait aussi s'appliquer aux objets. Merci pour ce partage d'infos.

De rien !

Je passe plus de temps à analyser la source qu'à écrire le code somme toute plutôt efficient, ceci expliquant cela …


We are all very ignorant, what happens is that not all ignore the same things … (Albert Einstein)

Rechercher des sujets similaires à "web scraping vba"