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 ) d'éditeur HTML.

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
16lire-web.xlsm (25.76 Ko)

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>
                            &nbsp;&nbsp;
                            <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 ...si on reprend le premier mot du titre du post dont je suis l'initiateur: comprendre, c'est bien ce que j'essaye de faire ici!

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

27page-complete.xlsm (19.65 Ko)

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 ), je vois que la cotation apparait en "gras" et qu'en plus, c'est le premier nombre en "gras" dans une visualisation descendante du site. Comme je sais que "gras" en html se dit "big", je cherche la première balise "big" dans le code de la page et, hop! le tour est joué

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

Rechercher des sujets similaires à "comprendre extraction donnee site web"