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 :</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°16 du 11/02/15</option>
<option selected="selected" value="847">Grille n°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)