Comprendre extraction de donnée de site web
Le souci c'est que cet ID change a chaque fois et pour la même valeur également, donc pour un tableau avec multiples valeurs, ça risque de poser des problèmes.
Merci pour cette autre méthode. Dans votre exemple, vous prenez "big" comme élément mais si on voulait récupérer comme dans l'exemple précédent le sous-jacent du bonus qui n'a pas de balise particulière, est-ce que cela fonctionnerait ?
De façon générale on peut pointer sur plusieurs types d'éléments d'une page Html:
* getElementById => comme l'a indiqué Steelson
* getElementsByClassName
* getElementsByName
* getElementsByTagName
Le dernier permet de pointer sur toutes les balises html existantes, même sans identification particulière.
Par exemple un tableau html classique <tr><td> se récupère avec un code du genre :
lig = 0
For Each Elem1 In oHtml.getElementsByTagName("tr")
lig = lig + 1
ReDim Preserve T(1 To 10, 1 To lig)
col = 0
For Each Elem2 In Elem1.getElementsByTagName("td")
col = col + 1
T(col, lig) = Elem2.innerText
Next Elem2
Next Elem1
Pierre
Bonjour,
Désolé, mais où est-ce que je trouve la balise "big" dans la page en question?
Quelle ligne du code?....je n'ai pas (ou ne sais pas que j'ai
Merci.
Dérivé de la proposition précédente :
On inscrit l'adresse de l'action en colonne B à la suite des autres et un clic sur le bouton récupère la cotation et sa variation.
On Error GoTo errhdlr
derlig = Sheets(1).Range("B" & Rows.Count).End(xlUp).Row
For lig = 2 To derlig
oHtml.body.innerHTML = HTML(Sheets(1).Cells(lig, 2).Value)
col = 3
For Each Elem In oHtml.getElementsByTagName("big")
Sheets(1).Cells(lig, col) = Elem.innerText
col = col + 1
Next Elem
Sheets(1).Cells(lig, col) = Format(Now, "dd/mm/yyyy hh:nn")
Next lig
Exit Sub
Hello,
OK, mais cela ne réponds pas à la question....
Dans la fonction ci-dessous:
For Each Elem In oHtml.getElementsByTagName("big")
Peux-tu m'indiquer le numéro de ligne de la page de code où se trouve la balise "big"? Je ne la trouve pas....
Don't Panik,
Ouvre une des pages concernées par exemple dans Firefox
Clic droit sur la page, menu "Code source de la page"
Une fois sur la page du code html : Ctrl+F
Une petite fenêtre de recherche s'ouvre en bas à gauche
Tape big
et le curseur se place à la première occurrence
Çà répond à la question?
De façon générale on peut pointer sur plusieurs types d'éléments d'une page Html:
* getElementById => comme l'a indiqué Steelson
* getElementsByClassName
* getElementsByName
* getElementsByTagName
Le dernier permet de pointer sur toutes les balises html existantes, même sans identification particulière.
Par exemple un tableau html classique <tr><td> se récupère avec un code du genre :
lig = 0 For Each Elem1 In oHtml.getElementsByTagName("tr") lig = lig + 1 ReDim Preserve T(1 To 10, 1 To lig) col = 0 For Each Elem2 In Elem1.getElementsByTagName("td") col = col + 1 T(col, lig) = Elem2.innerText Next Elem2 Next Elem1
Pierre
Absolument, merci Pierre pour ces compléments ... comme de plus en plus de sites sont mieux structurés, cela évite ma méthode ancestrale (bien qu'universelle) de triturer le texte du code source de la page.
J'ai toutefois des difficultés récurrentes avec getElementsByClassName
Par contre le getElementsByTagName que je n'utilisais jamais est intéressant ! et il peut sans doute s'appliquer ici pour le tag span
Bonjour,
Effectivement, Merci, ça répond à la question...mais pas à mon problème de compréhension
Comment savoir que le fait de spécifier la balise "big" va me retourner la valeur de la cotation du titre, au vu du code de la page?
Si je reprends l'exemple de cette valeur:
Le code source me donne la première occurrence de "big" en ligne 51 (si j'ai bien vu): quel rapport avec la cotation?
Bonjour,
Sur l'exemple ci-dessus, le <big> apparaît en ligne 589 juste avant la cotation :
<big class="fv-last">
<span id="brs-sl5a8be7231fda3"><span class="cotation">18.60 EUR</span></span> </big>
<big class="fv-var">
<span id="brs-sl5a8be7232012d" class="color3">0.65%</span> </big>
L'adresse exacte de la page est : http://www.boursorama.com/cours.phtml?symbole=1rPBEN
Bonjour,
En 589 de mon côté, voilà ce que j'ai:
data-tag-commander-click='{"label" : "menu::n3::bourse::opcvm::palmares-palmares-des-categories-morningstar", "s2": 2, "type" : "navigation"}'
De plus, là n'est pas la question
Je vais essayer de reposer la question: Quelle est la méthode pour connaitre, à partir du code source d'une page html, de nom de la balise que l'on va utiliser dans la fonction suivante: For Each Elem In oHtml.getElementsByTagName("") ou dans une autre, approchante?
La méthode qui consiste à faire durer un post le plus longtemps possible, en revanche, je crois que je l'ai bien comprise
Quel est ton navigateur ?
Bonjour à tous,
@mrjudam
Voici un extrait de la page : view-source:http://www.boursorama.com/cours.phtml?symbole=1rPBEN
Le codeur de ce site utilise la balise <big>
pour mettre en gras la case de la cotation
(au passage, en Html5 cette balise n'est plus utilisée, maintenant on préfère faire les styles en CSS à la place. Le codage de ce site doit dater un peu)
Le getElementsByTagName("big")
pointe sur le contenu de la case mise en gras, donc sur la cotation (comme l'a souhaité le codeur).
Le Elem.innerText
sélectionne uniquement le texte contenu entre les différentes balises entre <big> et </big>, soit le texte en noir non gras sur la copie d'écran plus haut.
Soit 18.60 EUR
puis 0.65%
CQFD.
/!\ Attention : ne pas confondre big dans la balise <big> et le mot big utilisé par exemple pour nommer une classe (ou autre indication) comme dans class="big ofbuysellbuttons ...
Pour répondre à la question suivante qui va venir :
Pour les pages de ce site, pourquoi choisir de pointer sur la balise big et non sur la classe cotation (avec un getElementsByClassName("cotation")
) comme le suggère habilement l'ami Steelson?
Tout simplement parce que dans cette page : autant le contenu de la balise big est unique => la cotation de l'action recherchée, autant la classe cotation contient plusieurs valeurs correspondantes à plusieurs actions.
Est-ce plus clair?
@Steelson
La méthode des split est toute aussi pertinente pour ce type de besoin. Et comme souvent il y a plusieurs manières de faire pour arriver au même résultat.
Pierre
Quelle est la méthode pour connaitre, à partir du code source d'une page html, de nom de la balise que l'on va utiliser dans la fonction suivante: For Each Elem In oHtml.getElementsByTagName("") ou dans une autre, approchante?
La méthode habituelle : afficher le code source de la page puis essayer de repérer la structure du code html par simple lecture (la connaissance du html est un plus)
Un outil simple pour récupérer la source (vue par excel)
ps : bonjour Pierre
Pour les pages de ce site, pourquoi choisir de pointer sur la balise big et non sur la classe cotation (avec un
getElementsByClassName("cotation")
) comme le suggère habilement l'ami Steelson?
et puis le getElementsByClassName("cotation")
ne fonctionne pas chez moi à tous les coups !
d'ailleurs ... https://stackoverflow.com/questions/35974796/using-getelementsbyclassname-in-excel-vba/35974931
Bonjour,
Alors, oui, c'est plus clair et non, ça ne répond pas à la question....
Si j'ai bien compris: je veux obtenir la cotation d'un cours de bourse, je regarde la page web de Boursorama (le vieux site en l'occurrence, moi, je regardais le nouveau
Est-ce bien la démarche?
Si oui, cela ne fonctionnera donc plus avec le nouveau site :
@Steelson
Quel résultat avec le code suivant chez toi?
Sub Test_getElementsByClassName()
Dim oHtml As New HTMLDocument, Elem As Object, lg As Integer
On Error GoTo errhdlr
lg = lg + 1
oHtml.body.innerHTML = HTML("http://www.boursorama.com/cours.phtml?symbole=1rPBEN")
lg = lg + 1
For Each Elem In oHtml.getElementsByClassName("cotation")
lg = lg + 1
Debug.Print lg & " " & Elem.innerText
Next Elem
Exit Sub
errhdlr:
MsgBox "Erreur lg=" & lg
End Sub
Function HTML(Url As String) As String
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", Url, False
.send
HTML = .responseText
End With
End Function
@mrjudam
point 1 : Bon raisonnement (rq : <big> c'est du html obsolète)
point 2 : Et non! Le nouveau site en html5 utilise du CSS (les premières lignes du code source), donc plus de <big>
A noter : sur mon PC, le nouveau lien que tu donnes renvoie automatiquement sur la page d'accueil, donc aucune chance de récupérer une valeur-action en particulier (je dois cliquer "à la main" pour ouvrir une page particulière)
si désolé, j'ai bien ceci :
3 18.70 EUR
4 18.70 EUR
5 18.50
6 18.74
7 18.32
8 18.48
9 17.82
10 19.66
11 23.20
12 18.28
13 19.00
14 18.28
15 22.75
16 18.28
17 23.20
18 17.79
19 23.20
20 12.81
21 23.20
22 11.11
23 23.20
24 7.77
25 23.20
26 7.56
27 20.13
28 20.51
29 18.48
30 0.7690
31 1.5880
32 1.0620
33 13.8850
34 0.2440
c'est donc ok !
ok, donc c'est fonctionnel!
- le 1 s'affiche si erreur sur l'adresse du site
- le 2 s'affiche si erreur sur le oHtml.getElementsByClassName
- le premier élément lu est numéroté 3
En revanche comme ce sont des éléments multiples, il faudrait les rattacher chacun à un nom d'action ... d'où la recherche sur le <big> qui lui est unique (sur "l'ancien" site tout au moins)
Sur le nouveau site, je me demande s'il n'y a pas des barrières pour bloquer la récup automatique (genre Disallow: /)
Hello,
Oserais-je soumettre le cas suivant à votre analyse éclairée:
Dans le nouveau site Boursorama (tant qu'à faire), les infos dont j'aurais besoin sont regroupées sous l'onglet "consensus" de la valeur, soit pour reprendre l'exemple Beneteau:
Les infos requises sont:
D'abord:
Cotation (18.76, en variation permanente)
Ensuite, à la date de l'extraction (ici, le 19/02/2018) (dernière colonne du tableau "objectif de cours"):
Nombre d'analystes (7)
Note médiane (1.71)
Objectif de cours médian (21.15)
Grand merci, par avance