Valeurs multiples dans code HTML dont les balises sont identiques
ha elle est la je commence à comprendre , ok
cURL.Offset(, 2).Resize(, 3)
re
ben la technique comme je te l'ai dit c'est de travailler avec un object document html
certes il faut un peu de connaissance (mais la base s’acquiert très facilement)
je ne sais pas comment procède BsalV mais si c'est en string ,c'est pas bon pour les raisons que j'ai cité au début de mes interventions
c'est a dire que le code outerhtml peut changer (voir d'une heure à l'autre) ce qui implique que les splits et instr et like et tout les fonctions string peuvent planter à tout moment
En DOM
les elements html ont des tagname (balises)(div table,tr,td,etc..etc) et ont des attributs
il te sera plus facile de modifier un code d'exploration en utilisant les librairies du DOM que du string
voir même à modifier si la page change
d'autant plus que je te montre en même temps que tu peux faire la lecture du code dynamiquement dans un document html virtuel
donc les données à jour a la seconde près
j'ai tout dit Bonne continuation
"c'est a dire que le code outerhtml peut changer (voir d'une heure à l'autre) ce qui implique que les splits et instr et like et tout les fonctions string peuvent planter à tout moment"
Oui je l'ai déjà vécu , bourso change ses pages de temps à autre
Merci pour toute ton aide et surtout effectivement ce qui pour moi est le plus important est de me sentir plus autonome a l'avenir , voir de pousser plus loin maintenant que je n'ai plus des balise a chercher en mode lecture statique ...
Bonne soirée
Grand merci BsAlv , ton code est en place et avec quelques modifes pour adapter sur mon fichier tout est nickel
Je relevé un seul petit bémol mais je vais creuser ... le fait de ne pas utiliser des bouts de codes dynamiques , ce qui peut s'avérer source d'erreur en cas d'ajout de lignes
Je vais voir pour utiliser ce type de lecture et adapter
URL = Cells( [www].Column).ValueMerci encore pour ton aide précieuse apporté et bonne soirée
re
bsAlV a parfaitement bien adapter ma premiere proposition
pour cibler les cellule il cible la premiere et la redimention a 3 cellule et lui envoie l'array(A,B,C) tout simplement
bonjour patrickT,
j'aime aussi votre manière de lire tous les tableaux
pour coller ces 3 données, au début j'avais
For Each cURL In Range("D1:D2").Cells 'boucler vos URL's
URL = cURL.Value
et puis je collais ceci
cURL.Offset(, 2).Resize(, 3).Value = Array(A, B, C) 'à partir de 2 cellules vers droite ces 3 cellules
Bonjour à vous trois !
C'est clair que je ne joue pas dans la même cours de récréation ! Bravo à vous !
perso j'y comprend rien à tout cela...
pas grave, je vais retourner jouer aux billes !
@ bientôt
LouReeD
bonjour LouReeD, amusez-vous bien
@PatrickT,
en regardant les propriétés du table, je me demandais si on ne pouvait pas utiliser le "arialabelledby" pour savoir le tableau qu'on veut traiter
voir PJ, le nom du tableau serait ici "forecasts-preview" et un chiffre
re
non BsAlV car demain le nom de la classe pourrait changer
perso comme je dis je prends le ancestor
ancestor c'est le parent .parent.parent de la table
en fait je prend le div et je pioche le childnodes(0) qui est une balise H2(titre du tableau)
et ensuite je prend la table(0) de ce div
l'idée de tester un texte dans le innertext est bien aussi
bref comme vous le constatez en utilisant le DOM ça devient tout de suite plus simple
looReed on ne peut pas être fort en tout chacun ses spé..
perso le grabbage web en VB et VBA ,j'en ai bouffé pendant des années
je suis notamment l'auteur du fichier genycourse (site de turf) ici et sur DVP qui a tourné pendant des années jusqu’à qu'il passe en app php
okay,
merci pour vos explications.
C'est dommage qu'il y ai pas un bouton "translate" comme sur Chrome ...pour me permettre de vous comprendre 🤣
Je rame à contre courant , mais rame...
Bonjour,
Je me perd dans la partie du code suivant :
Une fois le tableau identifier garce au mot clé : Bénéfice net par action/
On sélectionne la ligne qui contient les 3 valeurs :
Set TRS = oTable.getelementsbytagname("tr") 'MsgBox trs.Length
Set TR = TRS(TRS.Length - 1) 'dernière ligne = "PER"je me bat pour ajouter les autres valeurs , je n'arrive pas à traduire dans le code comment la ligne du PER est sélectionnée parmi les 3 autres ( Rendement / Bénéfice net par action/ PER )
Apres pour faciliter je pourrais sélectionner directement tout le tableau et écrire :
A = TR.Cells(1).innertext
B = TR.Cells(2).innertext
C = TR.Cells(3).innertext
D = TR.Cells(4).innertext
E = TR.Cells(5).innertext
F = TR.Cells(6).innertext
G = TR.Cells(7).innertext
H = TR.Cells(8).innertext
I = TR.Cells(9).innertext
cURL.Offset(, 35).Resize(, 9).Value = Array(A, B, C, D, E, F, G, H, I)peut être que ceci va t'aider à comprendre
chanque TR a 4 carré bleu
la collection des lignes donc des TR c'est set Trs=latable.getelementsbytagname("TR")
latable ayant été déterminée au préalable bien sur
la collection des cellule html donc des TD c'est
par exemple pour le PER
set Tds=Trs(TRs.length-1).getelementsbytagname("TD")
ou une autre méthode( depuis le query 2)
set TDs=TRs(TRs.length-1).cells
j'espère que ces petites indications vont t'éclairer
Patrick
cours N°2
ce qui est mis en rouge c'est ce que renvoie la propriété du TR complet pour le PER!!!
innertext:
<tr class="c-table__row c-table-evolution__row-top">
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-normal-whitespace">
PER
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
17,26
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
18,36
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
16,98
</td>
</tr>
'----------------------------------------------------------------------------------------------------------------------------------------------------
outertext
<tr class="c-table__row c-table-evolution__row-top">
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-normal-whitespace">
PER
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
17,26
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
18,36
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
16,98
</td>
</tr>
---------------------------------------------------------------------------------------------------------------------
innerhtml
innerhtml c'est l’intérieur de la balise
<tr class="c-table__row c-table-evolution__row-top">
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-normal-whitespace">
PER
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
17,26
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
18,36
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
16,98
</td>
</tr>
------------------------------------------------------------------------------------------------------------------------------------------------
outerhtml
et enfin le outerhtml c'est le complet
<tr class="c-table__row c-table-evolution__row-top">
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-normal-whitespace">
PER
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
17,26
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
18,36
</td>
<td class="c-table__cell c-table__cell--dotted c-table__cell--inherit-height c-table__cell--align-top / u-text-left u-text-right u-ellipsis">
16,98
</td>
</tr>
Bonsoir ,
Merci à vous deux :-)
J'utilise les explications de Patrick qui sont incroyablement précises , cette façon de présenter ( ton tableau + la décomposition des éléments de la page ) c'est vraiment Top !! Je suis en train de jouer avec pour tenter de bien comprendre …
BsAlv , j'écris mon code et au fur et à mesure je commente à ta manière , car tes commentaires détails bien les actions , c'est propre !
J'arrive à jouer avec et à sélectionner mes différents TDs , à les mettre au bon endroit dans mes cellules Excel , mais je reste bloqué sur une seule ligne a la fois ( un seul TRs)
Pour une meilleurs lisibilité j'ai mis en dur une seule source : URL = "https://www.boursorama.com/cours/MMM/"
( qui correspond Patrick à celui que tu a utiliser pour ton tableau )
Je vous envoi mon code , il ne marche pas
Set TRS = oTable.getelementsbytagname("tr") 'MsgBox trs.LengthSub MajRendements()
Sheets("COTATIONS").Select
Dim k%, cURL As Range, URL As String, Codehtml, A, B, C, D, E, F, G, H, P, M, N, O, TR, oTable, TRS, UR, VR, WR, WRS
k = Cells(Rows.Count, [REF].Column).End(xlUp).Row
Range(Cells(2, [per2k23].Column), Cells(k, [per2k23].Column)).Clear
Range(Cells(2, [per2k24].Column), Cells(k, [per2k24].Column)).Clear
Range(Cells(2, [per2k25].Column), Cells(k, [per2k25].Column)).Clear
Range(Cells(2, [bpa2k23].Column), Cells(k, [bpa2k23].Column)).Clear
Range(Cells(2, [bpa2k24].Column), Cells(k, [bpa2k24].Column)).Clear
Range(Cells(2, [bpa2k25].Column), Cells(k, [bpa2k25].Column)).Clear
Range(Cells(2, [valorisation].Column), Cells(k, [valorisation].Column)).Clear
For Each cURL In Range("C2:C29").Cells 'boucler vos URL's
URL = "https://www.boursorama.com/cours/MMM/"
Codehtml = GetHtmlcode(URL)
With CreateObject("htmlfile")
.body.innerhtml = Codehtml
For Each oTable In .getelementsbytagname("table") 'boucler chaque tableau
'MsgBox otable.innertext
If InStr(1, oTable.innertext, "Bénéfice net par action") > 0 Then 'selectione le tableau qui contient ce texte
Set TRS = oTable.getelementsbytagname("tr") 'MsgBox trs.Length
Set WRS = oTable.getelementsbytagname("wr") 'MsgBox wrs.Length
'les 4 lignes de la table html
Set WR = TRS(TRS.Length - 1) 'ligne = "per"
Set VR = TRS(TRS.Length - 2) 'ligne = "bpa"
Set UR = TRS(TRS.Length - 3) 'ligne = "rend"
Set TR = TRS(TRS.Length - 4) 'ligne = "div"
'les 3 cellules html de ligne 1 de la tablehtml
A = TR.Cells(1).innertext 'celulle = "div2k23"
B = TR.Cells(2).innertext 'celulle = "div2k24"
C = TR.Cells(3).innertext 'celulle = "div2k25"
'les 3 cellules html de ligne 2 de la tablehtml
D = UR.Cells(1).innertext 'celulle = "rend2k23"
E = UR.Cells(2).innertext 'celulle = "rend2k24"
F = UR.Cells(3).innertext 'celulle = "rend2k25"
'les 3 cellules html de ligne 3 de la tablehtml
G = VR.Cells(1).innertext 'celulle = "bpa2k23"
H = VR.Cells(2).innertext 'celulle = "bpa2k24"
P = VR.Cells(3).innertext 'celulle = "bpa2k25"
'les 3 cellules html de ligne 4 de la tablehtml
M = WR.Cells(1).innertext 'celulle = "per2k23"
N = WR.Cells(2).innertext 'celulle = "per2k24"
O = WR.Cells(3).innertext 'celulle = "per2k25"
cURL.Offset(, 29).Resize(, 3).Value = Array(A, B, C, D, E, F, G, H, P, M, N, O)
End If
Next oTable
End With
Next
Sheets("COTATIONS").Select
ActiveWorkbook.RefreshAll
End Sub'les 4 lignes de la table html
Set WR = TRS(TRS.Length - 1) 'ligne = "per"
Set VR = TRS(TRS.Length - 2) 'ligne = "bpa"
Set UR = TRS(TRS.Length - 3) 'ligne = "rend"
Set TR = TRS(TRS.Length - 4) 'ligne = "div"c'est la que je me perds ... je continue de regarder vos infos car ca fait beaucoup a absorber mais c'est passionnant :-)
length=5, donc de 0 à 5
Set WR = TRS(4) 'ligne = "per"
Set VR = TRS(3) 'ligne = "bpa"
Set UR = TRS(2) 'ligne = "rend"
Set TR = TRS(1) 'ligne = "div"
set TE= TRS(0) 'ligne avec ces années
et puis dans chaque TRS cellule(0) = ces explications, cellule(1)=2023, cellule(2)=estimat2024 et cellule(3)=estimat2025
