Extraire des valeurs du web

Bonjour à tous,

Je tente de créer un script VBA tout simple qui permettrait de récupérer automatiquement une valeur sur un site web (pour l'exemple, j'ai pris un cours de bourse) et de l'afficher dans une cellule (A1 par ex.). Mais je n'arrive pas à utiliser correctement getElementbyClassName("")...

Ca fonctionne si j'utilise getElementbyID sur un autre élément dans la page. Mais ce que je cherche se trouve encadré par un <span class...>.

Voici le code VBA.
Un grand merci à vous !

Sub Grab()

Dim appIE As Object
Dim HTML As HTMLDocument

Set appIE = CreateObject("internetexplorer.application")

With appIE
    .navigate "www . boursorama. com/cours/1rPAF/"
'je ne suis autorisé à mettre une URL donc j'ai mis des espaces, mais c'est pour expliquer, pas pour faire de la pub à Boursorama :-)
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Set HTML = appIE.document

Set PrixAction = HTML.getElementByClassName("c-instrument c-instrument--last")
ActiveSheet.Range("A1") = PrixAction.innerText

Set HTML = Nothing

'appIE.Quit

End Sub

Bonjour,

En effet, ça semble plus simple que le présent code. Il y a juste une ligne à rajouter :

Sub Bourse()

Dim appIE As Object
dim allRowOfData
Dim myValue As String

Set appIE = CreateObject("internetexplorer.application")

With appIE
    .navigate "l'URL du site web, www . boursorama . com/cours/1rPAF/"
'j'ai du mettre des espaces car je n'ai pas le droit de poster l'url...
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Set allRowOfData = appIE.document.getElementsByClassName("c-instrument c-instrument--last")
myValue = allRowOfData

Range("A1").value = myValue 'la ligne ajoutée pour afficher valeur de myValue en A1

appIE.Quit
Set appIE = Nothing

End Sub

Cependant, il est possible voire fort probable que le code génère une erreur au niveau de l'affectation de myValue. En effet, allRowOfData semble être un objet qui héberge plusieurs éléments et non une seule chaîne de caractères. Il faudra donc peut-être ajuster...

myValue = allRowOfData.item(0) '.l'attribut que vous voulez récupérer

Cordialement,

Merci @3GB !

Entre temps j'ai (essayé) d'améliorer mon code mais ça ne marche toujours pas : voir mon message initial qui a été édité juste avant votre réponse.
J'ai repris mon ancien code (celui que vous aviez vu) et j'ai tenté d'ajouter votre ligne mais ça m'affiche [object HTMLSpanElement] et non la valeur que je cherche (=le prix de l'action).

Est-ce que mon nouveau code est + propre ? Comment récupérer une valeur avec getElementsbyClassName ?
Encore un grand merci pour votre aide !

Je vous en prie !

Alors, malheureusement, je suis loin d'être compétent en la matière, tout ça reste assez vague pour moi. Mais je vois grossomodo comment faire mais sans maîtriser la syntaxe.

Oui, votre code est bien plus propre mais il manque toujours la question centrale de l'élément ciblé.

Car avec le HTML.getElementsByClassName, vous stockez tous les éléments HTML relevant de la classe "c-instrument c-instrument--last" et pas qu'un seul.
Déjà, si vous arriviez à obtenir les éléments grâce à HTML.getElementByID, ce serait mieux.
Il faut donc que vous cibliez sur le ou les élements qui vous intéressent. Supposons que ce soit le premier :

Sub Grab()

Dim appIE As Object
Dim Lien$
Dim HTML As HTMLDocument
Dim PrixAction

Lien = range("E1").value 'ici le lien est en cellule E1 > ça évite de faire de la pub pour boursomara^^

Set appIE = CreateObject("internetexplorer.application")

With appIE
    .navigate Lien
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Set HTML = appIE.document
Set PrixAction = HTML.getElementsByClassName("c-instrument c-instrument--last")

ActiveSheet.Range("A1") = PrixAction.item(0).innerText

Set PrixAction = Nothing
Set HTML = Nothing
'appIE.Quit
'Set appIE = Nothing

End Sub

Il ne faut pas que vous hésitiez à regarder ce que contiennent vos variables dans la fenêtre variables locales (qui s'affiche, si ce n'est pas déjà le cas, à partir du menu affichage de l'éditeur).

Cordialement,

Et une petite variante sur le même principe :

Sub Grab()

Dim appIE As Object
Dim Lien$
Dim HTML As HTMLDocument
Dim PrixAction
Dim i%

Lien = range("E1").value 'ici le lien est en cellule E1 > ça évite de faire de la pub pour boursomara^^

Set appIE = CreateObject("internetexplorer.application")

With appIE
    .navigate Lien
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Set HTML = appIE.document
Set PrixAction = HTML.getElementsByClassName("c-instrument c-instrument--last")

For i = 0 to PrixAction.items.count - 1
    cells(i+1,1).value = PrixAction.item(i).innerText
next i

Set PrixAction = Nothing
Set HTML = Nothing
'appIE.Quit
'Set appIE = Nothing

End Sub

Je ne sais pas si ça marchera mais l'idée est là : ça permettrait de récupérer la valeur de chaque élément grâce à une boucle.

Encore merci pour votre aide !

Bon, ça ne fonctionne pas
Je ne vois pas l'intérêt de la boucle puisque la page qui contient l'info recherchée n'affiche qu'une seule action (je pense que c'est utile quand on a une liste d'actions, non ?).

J'ai affiché les variables comme conseillé, et voilà le résultat... c'est grave docteur ? On retrouve bien le lien vers Bourso**** que j'ai mis en E1, mais c'est tout.

Je suis un peu paumé, je pensais que ce serait + simple de récupérer une chaine de caractère sur une page web.

Une autre idée ?
Merci

image

Oui, la boucle c'est pour récupérer toutes les valeurs quand elles sont nombreuses (je ne pensais pas qu'il y en avait qu'une seule).

Alors, c'est très bien pour les variables locales mais je ne m'explique pas que toutes les variables soient à 0, excepté le lien.

Est-ce que vous voyez la page internet s'ouvrir ?

Il faudrait que vous exécutiez la macro au pas à pas avec la touche F8 (en vous plaçant au sein de la macro). Vous verriez alors les variables être affectées au fur et à mesure, sachant que celle qui nous intéresse le plus est PrixAction.

Ah non, c'est super complexe je trouve, parce que les structures HTML varient d'un site à l'autre. Il faut de la patience, surtout quand on ne maitrise pas parfaitement le développement.

Quitte à me répéter, merci pour le coup de main, c'est vraiment sympa !

J'ai exécuté la macro pas à pas (F8) et ça bloque sur la ligne
For i = 0 To PrixAction.items..., je vous joins la capture d'écran de l'erreur.

Si on met de côté la boucle i, peut-etre qu'on simplifie le code et qu'on évite l'erreur ? Je vais essayer...
Mais bon, mon souci est toujours d'affecter ce que je trouve dans "getElement" à une cellule (ex : A1).

image

Oui, en effet, il faut abandonner la boucle si PrixAction ne contient qu'un élément.

En fait, la priorité est de voir ce que contient la variable PrixAction. Une fois que PrixAction sera bien déterminé, le reste sera très simple.

Bonjour,

une solution via powerquery

Merci @H2so4 !

Pourriez-vous nous expliquer comment vous avez fait ? Je ne connais pas PowerQuery, et je ne vois pas de code dans l'exemple que vous avez envoyé.

Pour ceux qui suivent mes (mes)aventures, j'ai fini par trouver la solution "à l'ancienne" via un code VBA (sans PowerQuery qui doit surement simplifier les choses), et voici le résultat ci-dessous. Ce code vous permet de récupérer un élément situé dans une page web et de l'afficher dans une cellule.

Merci à @3GB pour son aide et sa patience :)

Sub Grab()

Dim appIE As Object
Dim HTML As HTMLDocument
Dim PrixAction

Set appIE = CreateObject("internetexplorer.application")

With appIE
    .navigate "www. boursorama.com /cours/1rPML/"
'je n'ai pas le droit de mettre l'URL donc j'ai mis des espaces
    .Visible = True
End With

Do While appIE.Busy
    DoEvents
Loop

Set HTML = appIE.document

PrixAction = HTML.getElementsByClassName("c-instrument c-instrument--last")
ActiveSheet.Range("A1") = PrixAction.innerText

Set HTML = Nothing

appIE.Quit

End Sub

bonjour,

une exemple du "comment faire avec power query" sur you tube

Merci H2so4 pour le lien et pour la franche rigolade sur "powerkery"

C'est pratique quand on veut prendre une valeur qui est structurée, comme dans un tableau html.

Or la question qui était posée, c'était de récupérer des éléments qui se trouvent dans des span class et autres div.

Merci quand même.

Bonjour le forum

Si j'ai bien compris

Bonjour,

@ckidon,

Ta procédure n'est pas fonctionnelle sous Microsoft Excel 365.

iso4217

Cdlt.

Bonjour @Jean-Eric

As-tu essayé de retirer les espaces dans l'URL du site ?

(pour mémoire, j'avais mis des espaces car je n'ai pas le droit de poster d'URL sur ce forum).

Re,

j'avais ajouté les références nécessaires, mais pas attention aux espaces.

Fonctionnel

Cdlt.

Ca arrive ;-)

Rechercher des sujets similaires à "extraire valeurs web"