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

image

Je vais voir pour utiliser ce type de lecture et adapter

URL = Cells( [www].Column).Value

Merci 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

12pim.xlsm (20.01 Ko)

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 )

image

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

image

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>


re,

un autre essai

12pim.xlsm (23.40 Ko)

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 mais ils vous permettra de voir ce que je tente de faire et ou je bloque , je pense que c'est cette étape qui me pose problème et que je ne comprend pas :

 Set TRS = oTable.getelementsbytagname("tr") 'MsgBox trs.Length
Sub 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

bon bas déja y avait une erreur a la fin :-) je n'avais pas modifié le RESIZE

cURL.Offset(, 29).Resize(, 12).Value = Array(A, B, C, D, E, F, G, H, P, M, N, O)
image

Heuuuuu bas en fait je suis pas sur qu'il y ai une erreur du coup puisque mes chiffres sont bons

Rechercher des sujets similaires à "valeurs multiples code html balises identiques"