Comprendre extraction de donnée de site web

Bonjour,

Il a quelque temps, j'avais récupéré sur ce forum un code VBA permettant d'extraire des valeurs de cours de bourse d'après l'URL de la page de la valeur sur le site Boursorama.

Ne connaissant pas grand chose à VBA (voire nada, nib, niente), j'avais fait un peu de copier/coller pour ajouter un bouton permettant d'obtenir l'objectif de cours (voir exemple ci-joint).

Dans le but mettre au point ce code et de l'agrémenter en ajoutant le "consensus" c'est à dire la recommandation moyenne des analystes, j'aimerais mieux comprendre les fonctions qui le composent, ce code.

En particulier, quelqu'un peut-il m'expliquer comment localiser/repérer dans le site web (de Boursorama, en l’occurrence) l'endroit d’où est extraite une donnée (.responseText?...) et pourquoi, dans le code joint, la macro ne renvoie pas l'information d'objectif de cours alors que celle-ci existe bien (mais elle a été atteinte) (cf les trois dernières valeurs de l'exemple).

Merci d'avance pour votre aide.

Tiens cela vient de moi !!

la macro ne renvoie pas l'information d'objectif de cours alors que celle-ci existe bien (mais elle a été atteinte) (cf les trois dernières valeurs de l'exemple)

je regarde ...

Il n'y a pas dans la source

Objectif de cours 3 mois : 

mais

<div align="center">
        <p>L'objectif de cours fixé par les analystes à </p>
        <p class="txt04 gras">7.50 EUR</p>
        <p>a été atteint</p>
</div>

Bonjour,

Et donc, merci pour ce code.

Mais quelle est la réponse?

Comment fait-on pour obtenir le code source?

Et ensuite, quelle partie du code source permet d'obtenir la donnée et via quelle fonction VBA?

De plus, pourquoi obtient-t-on des données pour certaines valeurs mais pas pour d'autres avec la même macro?

Comme je le précisais, c'est plus d'une petite explication générale dont j'aurais besoin, histoire d'essayer de devenir un peu plus autonome, quoi

Merci.

Comme je le précisais, c'est plus d'une petite explication générale dont j'aurais besoin, histoire d'essayer de devenir un peu plus autonome, quoi

okay

Comment fait-on pour obtenir le code source?

interroge via chrome/firefox/... et fais "afficher la source"

capture d ecran 30

Et ensuite, quelle partie du code source permet d'obtenir la donnée et via quelle fonction VBA?

faut fouiller ... et inclure dans le code le texte pertinent

capture d ecran 31

De plus, pourquoi obtient-t-on des données pour certaines valeurs mais pas pour d'autres avec la même macro?

C'est le site qui ne donne pas la même réponse en fonction des actions !!

Ajout ...

dans la macro, la fonction split permet de tirer de .responseText -qui contient tout le code de la page- la zone souhaitée

Merci beaucoup pour ces explications

Hello,

Désolé, ça bloque

Si je prends l'exemple de la valeur Beneteau (http://www.boursorama.com/cours.phtml?symbole=1rPBEN), la portion de code dans laquelle apparait l'objectif de cours (21.15, en l'occurrence) est la suivante:

<!-- Objectives-->

<div id="b021d4107" class="block" >

<div class="hd"><span class="title"><h2 style="display: inline;">Objectif de cours dans 3 mois</h2> <small>au 12/02/2018</small></span></div>

<div class="bd" >

<div align="center">

<p class="txt04 gras">21.15 EUR</p>

<p>Soit un potentiel de :</p>

<p class="txt04 color3 gras">12.62 %</p>

<p>Cours indicatif de :

18.780 EUR </p>

</div>

</div><div class="cb"></div>

</div>

</div>

<div class="span-half">

Quelle est le nom de la variable qui doit passer dans les paramètres pour obtenir le résultat? Parce que si j'essaye "Objectif de cours dans 3 mois", ça ne fonctionne pas...

à la limite près le site affiche :

capture d ecran 35

néanmoins je vais te répondre sur la cas rencontré !

la portion de code dans laquelle apparait l'objectif de cours (21.15, en l'occurrence) est la suivante:

    <!-- Objectives-->

<div   id="b021d4107" class="block" >

<div class="hd"><span class="title"><h2 style="display: inline;">Objectif de cours dans 3 mois</h2> <small>au 12/02/2018</small></span></div>
<div class="bd" >

<div align="center">
    <p class="txt04 gras">21.15 EUR</p>
    <p>Soit un potentiel de :</p>
    <p class="txt04 color3 gras">12.62 %</p>
    <p>Cours indicatif de : 
    18.780 EUR    </p>
</div>

</div><div class="cb"></div>
</div>

</div>

<div class="span-half">

Quelle est le nom de la variable qui doit passer dans les paramètres pour obtenir le résultat? Parce que si j'essaye "Objectif de cours dans 3 mois", ça ne fonctionne pas...

si <p class="txt04 gras"> est bien unique sur la page, alors encadre ta valeur recherchée par

<p class="txt04 gras"> et </p>

le résultat sera trouvé avec ceci

 = Split(Split(.responseText, "<p class=""txt04 gras"">")(1), "</p>")(0)

Ah, donc cette fonction est très dépendante de l'unicité des textes présents dans le code et en relation avec la valeur recherchée

Est-ce que cela fonctionnerait si la chaine de caractère est répartie sur plusieurs lignes? Dans l'exemple précédent si je cherche 12.62 %, est-ce que je peux l'encadrer avec: "Soit un potentiel de :</p><p class="txt04 color3 gras">" et "</p>"?

Évidemment, je peux essayer, mais en cas d'erreur, je ne saurais pas si ça vient de la syntaxe du code ou d'une mauvaise interprétation...

Merci encore.

Bonsoir,

Je me permets de poser ma question dans ce sujet récent car j'ai la même interrogation concernant une extraction sur le même site mais pour des données différentes.

Sur cette page : view-source:http://www.boursorama.com/cours.phtml?symbole=1rP6317C

Je ne comprends pas la syntaxe :

If .Status = 200 Then COT(i, 1) = Val(Split(.responseText, "cotation"">", 2)(1))

Cela va rechercher "cotation"">" mais il y a 2 guillemets alors que dans l'original il y a : "cotation">127.640 (c) EUR

Que signifie le 2) et le (1) ?

Comme il y a plusieurs fois cotation, comment savoir lequel il va chercher ?

Dans mon tableau, je souhaite récupérer également la valeur du Sous-Jacent à ce bonus qui se trouve sous les boutons ACHAT/VENTE du site mais qui a exactement la même syntaxe que la précédente cotation. Comment récupérer celle-ci ?

Dans l''exemple la valeur est 126.20

Merci d'avance.

Fred

Hello,

Beaucoup de qsuestions ...

Cela va rechercher "cotation"">" mais il y a 2 guillemets alors que dans l'original il y a : "cotation">127.640 (c) EUR

en effet, mais comme c'est inséré dans un champ texte VBA, cela permet de le prendre en compte comme ceci cotation"> (à l'inverse le champ VBA se serait arrêté au premier guillemet et attendrait ensuite une variable

Que signifie le 2) et le (1) ?

Comme il y a plusieurs fois cotation, comment savoir lequel il va chercher ?

Justement, c'est le (1) qui le détermine

l'indice (0) est pour le début de .responstexte jusque la recherche

l'indice (1) ensuite

et si on le trouve plusieurs fois ce sera (2) etc.

Pour le 2), tu as l'explication ici https://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/split-function

Merci pour les réponses mais j'ai encore du mal à comprendre.

Pour les guillemets, c'est OK.

Pour le (1), je vais prendre un exemple pour voir si j'ai bien compris le truc.

Un fichier basique :

Je cherche la cotation de l'action Z

La chaîne de caractère a trouver est cotation donc l'index (0) est "Je cherche la ", l'index (1) est "cotation" et l'index (2) ce serait un autre cotation présent dans le texte ?

Pour le 2), je ne saisi pas bien la nuance entre les formats de comparaison.

Pour rajouter donc un champ qui aille chercher une autre valeur cotation, que faut-il faire ? Modifier l'index ?

Pouvez-vous y jeter un oeil et le modifier pour que je regarde la structure ?

Encore merci.

La chaîne de caractère a trouver est cotation donc l'index (0) est "Je cherche la ", l'index (1) est "cotation" et l'index (2) ce serait un autre cotation présent dans le texte ?

absolument !

capture d ecran 39

Pour le 2), je ne saisi pas bien la nuance entre les formats de comparaison.

en fait je préfère ceci ... un double split sur lequel je te laisse cogiter

        COT(i, 1) = Val(Split(Split(.responseText, "cotation"">")(1), "</span>")(0))
        SJ(i, 1) = Val(Split(Split(.responseText, "cotation"">")(2), "</span>")(0))
18cours-action.xlsm (61.25 Ko)

Bonjour,

Merci d'avoir modifié le fichier en conséquence.

OK pour le principe de l'index suivant le choix du numéro "d'apparition" de la valeur dans le fichier source.

Si je décortique le Split, il va chercher le premier cotation et l'index 0 correspond au chiffre à afficher vu q'il y a un espace entre cotation et le chiffre ?

C'est pour cela qu'il ne prend pas aussi le (c) ?

Pour le double Split, par contre, je n'en ai aucune idée.

C'est pour cela qu'il ne prend pas aussi le (c) ?

Non c'est grâce au Val

Enlève Val et tu verras ...


Pour le double Split, par contre, je n'en ai aucune idée.

Split(Split(.responseText, "cotation"">")(1), "</span>")(0)

je décortique :

Split(.responseText, "cotation"">")(1)

donnera blablablabla cotation"> tructructructructructructructruc</span>machinmachin après cotation"> car (1)

Split(______________________________, "</span>")(0)

donnera tructructructructructructructruc avant </span>) car (0)

ensuite Val ne retient que les chiffres

Bonjour à tous,

Je me permets de proposer une autre méthode d'import d'info d'un site web, utilisant ici un simple 'getElementsByTagName'.

Cette méthode permet de cibler assez précisément l'info voulue, et donc de simplifier le code.

Sub Go()
Dim oHtml As New HTMLDocument, Elem As Object, col As Integer

    On Error GoTo errhdlr
    oHtml.body.innerHTML = HTML(Sheets(1).Cells(2, 1).Value)
    col = 2
    For Each Elem In oHtml.getElementsByTagName("big")
        Sheets(1).Cells(2, col) = Elem.innerText
        col = col + 1
    Next Elem
    Sheets(1).Cells(2, col) = Now
    Exit Sub

errhdlr:
    MsgBox "Mise à jour non réalisée"
End Sub

Pierre

28lire-web.xlsm (29.30 Ko)

Non c'est grâce au Val

Enlève Val et tu verras ...

Effectivement, ça affiche tout sans le VAL.

Split(Split(.responseText, "cotation"">")(1), "</span>")(0)

je décortique :

Split(.responseText, "cotation"">")(1)

donnera blablablabla cotation"> tructructructructructructructruc</span>machinmachin après cotation"> car (1)

Split(______________________________, "</span>")(0)

donnera tructructructructructructructruc avant </span>) car (0)

ensuite Val ne retient que les chiffres

[/quote]

OK, cela permet de réduire la recherche dans la recherche.

Je me permets de proposer une autre méthode d'import d'info d'un site web, utilisant ici un simple 'getElementsByTagName'.

Cette méthode permet de cibler assez précisément l'info voulue, et donc de simplifier le code.

Bonjour,

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 ?

'getElementsByTagName'.

C'est en effet plus pro quand le site est bien structuré comme ici

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 ?

prend id :

getElementById("brs-sl5a8aea4c332b7")
Rechercher des sujets similaires à "comprendre extraction donnee site web"