Pb extraction cours de bourse du code html de Sicavonline

Hello ,

Grand merci (notamment aux nombreux et incroyables post de Steelson), pour une technique de recuperation de cours de sicav en recherchant des caractères dans une page web, et que je maitrise pour plusieurs site web. Malheureusement je n’arrive pas à trouver l’expression de « avant » et « apres » pour que cela marche avec Sicavonline (malgré l’essai de nombreuses variantes):

cours 120,65 € (le 17 Jan 2021)

Le cours apparait à 2 endroits du code de la page web :

8endroit-1.pdf (21.38 Ko)
5endroit-2.pdf (12.30 Ko)

Variante 1 qui ne marche pas :

avant = "<div id=""VL"">"

apres = " EUR </div>"

Variante 2 qui ne marche pas non plus :

avant = """Price"": """

apres = """, "

ci-joint le fichiers Excel

D’avance merci si vous pouvez me montrer la solution.

Rico44

Bonjour,

ce que je ne comprends pas bien pour le moment, c'est ceci :

capture d ecran 365

je crains que le site n'accepte pas une interrogation à partir d'excel.

Je vais explorer cela à partir d'autres moyens (car tes définitions de avant et apres sont tout à fait justes !)

J'ai lancé une simple interrogation et en effet cela ne permet pas d'appeler le contenu de la page

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            MsgBox .responseText
        End If
    End With

il faut simuler un navigateur

suite ...

As-tu la possibilité d'utiliser Google Sheets qui est très adapté à cette recherche par une simple formule (sinon je le ferai avec excel mais d'une façon bien plus complexe)

=importxml(URL;"//div[@id='VL']")
capture d ecran 366

https://docs.google.com/spreadsheets/d/1lLAVUHrLs9cTkpnEAbZkzzoIiaAFnATkB_OxYpnYhb4/edit?usp=sharing

Steelson, le "fanatique d'Excel" qui solutionne plus vite que son ombre ;-)

Merci déjà pour cette investigation, car j'ai aussi eu ces messages d'erreurs de "certificat" et j'ai commencé à modifier un peu tous les paramètres de sécurité pensant que c'etait ma configuration.

1-Mais comme je bute sur cet obstacle Sicavonline, et voudrais bien comprendre au moins pourquoi cela ne marche pas.

2-Faudrait t'il coder les espaces et tabulations qui sont visualisés dans le code XML de la page web ? et comment coder dans le avant/aprés les tabulations ??

3-J'ai passé de nombreuses heures à essayer de trouver un fix. En fait je suis débutant en VBA et ne comprend meme pas l'algorithme qui est derriere ce VBA trés compact. J'ai simplement changé ce qui me parraissait dependant de mon cas d'usage (avant, aprés) et cela donnait satisafaction.

Je serai preneur d'une explication ligne à ligne de ce petit VBA si celà existe, à titre de formation.

4-Je ne connais pas du tout Google sheets et je vais essayer de regarder.

edit : Pour le 1 et 2, l'explication se trouverait ici https://forum.excel-pratique.com/excel/pb-extraction-cours-de-bourse-du-code-html-de-sicavonline-151..., cela dit ça n'explique pas le pourquoi mais met en lumière le point de blocage !


Pour le 3, voici une explication sur un code plus limpide (car celui que tu utilises est un code réellement imparfait de mes débuts)

1- Ceci permet d'interroger une url et recueillir la réponse

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            MsgBox .responseText
        End If
    End With

2- Il faut ensuite traiter ce code source.

  • soit on le traduit en langage "objet" qu'on appelle DOM https://fr.wikipedia.org/wiki/Document_Object_Model
  • soit on traite directement le texte ce qui est parfois plus simple et plus rapide, et c'est là qu'intervient la fonction split doublée que j'utilise souvent
TEXTE = "ABCD-EFGH-IJKL"
extrait = split(TEXTE,"-")

alors extrait est un tableau à 3 valeurs :

  • extrait(0) vaut ABCD c'est-à-dire la partie antérieure au premier tiret
  • extrait(1) vaut EFGH c'est-à-dire la partie postérieure au premier tiret

donc si je fais

avant = "1234"
apres = "5678"
texte = "_______1234ABCDEF5678________"
extraction = split(texte,avant)(1) ' pour avoir la partie postérieure
extraction = split(extraction,apres)(0) ' pour avoir la partie antérieure

et dans ce cas je récupère ce qui est entre avant et apres

Pour la suite, dis moi si tu utilises Google Sheets, ou si tu veux poursuivre une voie (qui v s'avérer un peu plus complexe) d'excel ?

bonjour a tous

un exemple simple

Function GetHtmlcode$(url)
    With CreateObject("microsoft.xmlhttp")
        .Open "get", url, False
        .send
        GetHtmlcode = .responsetext
    End With

End Function

Sub test()
    Dim lestableaux As Object
    With CreateObject("htmlfile")
        .body.innerhtml = GetHtmlcode("https://www.sicavonline.fr/index.cfm?action=fiche&code=00000028990")
        Set lestableaux = .getelementsbytagname("TABLE")
        MsgBox lestableaux(0).innertext
        MsgBox lestableaux(1).innertext
    End With
End Sub

si tu me dis quelle case tu veux récupérer dans les tables html de la page je te fait l'extraction proprement en DOM pour toutes tes lignes

sans passer par des splits de texte qui ne seront jamais surs du fait que la structure de page ou des tableaux peut changer à tout moments

on peut aussi extraire les tableaux complet sans problèmes

Bonjour Patrick

on peut aussi extraire les tableaux complet sans problèmes

je suis curieux de voir ... car ceci ne donne rien !

Function GetHtmlcode$(url)
    With CreateObject("microsoft.xmlhttp")
        .Open "get", url, False
        .send
        GetHtmlcode = .responsetext
    End With
End Function
Sub test()
    MsgBox GetHtmlcode("https://www.sicavonline.fr/index.cfm?action=fiche&code=00000028990")
End Sub

edit : correction de l'url qui était incomplète

si tu me dis quelle case tu veux récupérer dans les tables html de la page je te fait l'extraction proprement en DOM pour toutes tes lignes

le but est de récupérer le div dont l' id est "VL" (ce qui se fait facilement avec Google Sheets)

bonjour Steelson

la réponse pour moi est claire

image

le code ou est ecrit oups!!..... est dans un script

il ne ressord donc pas dans le body html du document html en memoire car le script crée une page avec

image

donc comme on a aucune possibilité de pointer l'element(aucun id,aucune classname unique ,etc)

on détecte simplement cette expression dans la page avec like

Function GetHtmlcode$(url)
    With CreateObject("microsoft.xmlhttp")
        .Open "get", url, False
        .send
        GetHtmlcode = .responsetext
    End With

End Function

Sub test()
    Dim lestableaux As Object
    With CreateObject("htmlfile")
        .body.innerhtml = GetHtmlcode("https://www.sicavonline.fr/index.cfm?action=fiche&code=00000028990")
        Set lestableaux = .getelementsbytagname("TABLE")
         If Not .body.innerhtml Like "*Page inexistante*" Then
            If lestableaux.Length > 0 Then
                MsgBox lestableaux(0).innertext
                MsgBox lestableaux(1).innertext
            End If
        Else: MsgBox "page not found!!"
        End If
    End With
End Sub

donnez moi la valeur a récupérer dans ces tables ?

image

désolé, erreur de recopie de l'url

https://www.sicavonline.fr/index.cfm?action=fiche&code=00000028990

il ne ressord donc pas dans le body html du document html en memoire car le script crée une page avec ...

donc comme on a aucune possibilité de pointer l'element(aucun id,aucune classname unique ,etc)

ma solution dans ce cas est de lancer (via excel) la page et la visu du code source dans un navigateur et ensuite en tirer la valeur par

        page.body.innerHTML = txt
        For Each elem In page.getElementsByTagName("div")
            If elem.getAttribute("id") = "VL" Then Sheets(1).Cells(ligne, 2) = elem.innerHTML
        Next

mais c'est une solution bien plus complexe que d'utiliser Google Sheets et XPath

re

cette page existe je la choppe bien et j'ai bien mes deux tables

demo8

re

tiens voila tes 3 tableaux identifié

comme la fonction getelementsbyclassname a toujours déraillé aussi loin que je m'en souvienne, on créée un tableau d'object en bouclant sur une classe

Sub test()
    Dim lestableaux() As Object
    With CreateObject("htmlfile")
        .body.innerhtml = GetHtmlcode("https://www.sicavonline.fr/index.cfm?action=fiche&code=00000X09032")
        If Not .body.innerhtml Like "*Page inexistante*" Then
            For Each elem In .all
                If elem.classname = "bloc_gene_suite" Then ReDim Preserve lestableaux(0 To i): Set lestableaux(i) = elem: i = i + 1
            Next
            MsgBox "tableau de Performance est volatilité" & vbCrLf & lestableaux(0).innertext   'tableau de Performance est volatilité
            MsgBox "tableau de synthese" & vbCrLf & lestableaux(1).innertext    'tableau de synthese
            MsgBox "tableau de Point clé" & vbCrLf & lestableaux(2).innertext    'tableau de Point clé
        Else
            MsgBox "page inexistante"
        End If
    End With
End Sub

ne reste plus qu'a pecher les element dans les items object de l'array lestableaux ou directement a partir du document si il y a un ID (qui est sensé etre unique)

par exemple la valeur liquidative directe par le document et .getelementbyid

MsgBox "valeur liquidative:" & .getelementbyid("VL").innertext
      

sinon en le péchant dans le tableau synthese

  MsgBox "valeur liquidative:" & lestableaux(1).getelementsbytagname("DIV")(27).innertext
       

on constate effectivement que ce ne sont pas des tables simples les lignes (pseudo TR/TD)mais ce sont sont des DIVS arrangés en CSS

BREF DONC

pour le tableau synthese par exemple il faut aller chercher la classe "ligne_fiche_val" dans lestableaux(1)

pour récupérer les données

image

peut être pour toi Steelson si tu est dans une région particulière(selon les pays) il te faudra imiter la requête(on window) et donc utiliser quelque lignes avec SetRequestHeader dans Getcodehtml

tiens Steelson teste celle ci

Function GetHtmlcode$(url)
    With CreateObject("Microsoft.XmlHttp")
        .Open "get", url, False
        .setRequestHeader "Accept", "text/html, application/xhtml+xml, */*"
        .setRequestHeader "Accept-Language", "fr-FR"
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
        .setRequestHeader "Accept-Encoding", "gzip, deflate"
        .setRequestHeader "Host", "www.sicavonline.fr"
        .setRequestHeader "DNT", 1
        .setRequestHeader "Connection", "Keep - Alive"
        .setRequestHeader "Cache-Control", "no-cache"
        .send
        GetHtmlcode = .responsetext
    End With

End Function

Sub test()
    Dim lestableaux() As Object
    With CreateObject("htmlfile")
        .body.innerhtml = GetHtmlcode("https://www.sicavonline.fr/index.cfm?action=fiche&code=00000X09032")
        If Not .body.innerhtml Like "*Page inexistante*" Then
            'For Each elem In .all
                'If elem.classname = "bloc_gene_suite" Then ReDim Preserve lestableaux(0 To i): Set lestableaux(i) = elem: i = i + 1
            'Next
            'MsgBox "tableau de Performance est volatilité" & vbCrLf & lestableaux(0).innertext   'tableau de Performance est volatilité
            'MsgBox "tableau de synthese" & vbCrLf & lestableaux(1).innertext    'tableau de synthese
            'MsgBox "tableau de Point clé" & vbCrLf & lestableaux(2).innertext    'tableau de Point clé

            MsgBox "valeur liquidative:" & .getelementbyid("VL").innertext
            'MsgBox "valeur liquidative:" & lestableaux(1).getelementsbytagname("DIV")(27).innertext
        Else
            MsgBox "page inexistante"
        End If
    End With
End Sub

et pour conclure

avec la requête en bon et du forme et en serie pour tout les ISINS

Function GetHtmlcode$(url)
    With CreateObject("Microsoft.XmlHttp")
        .Open "get", url, False
        .setRequestHeader "Accept", "text/html, application/xhtml+xml, */*"
        .setRequestHeader "Accept-Language", "fr-FR"
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
        .setRequestHeader "Accept-Encoding", "gzip, deflate"
        .setRequestHeader "Host", "www.sicavonline.fr"
        .setRequestHeader "DNT", 1
        .setRequestHeader "Connection", "Keep - Alive"
        .setRequestHeader "Cache-Control", "no-cache"
        .send
        GetHtmlcode = .responsetext
    End With

End Function
Sub test2()
    Set DhtmL = CreateObject("htmlfile")
    For Each cel In Feuil1.Range("C4:C" & Feuil1.Cells(Rows.Count, "C").End(xlUp).Row).Cells
         DhtmL.body.innerhtml = GetHtmlcode(cel.Value)
        If Not DhtmL.body.innerhtml Like "*Page inexistante*" Then
            cel.Offset(, 1).Value = DhtmL.getelementbyid("VL").innertext
        Else
            cel.Offset(, 1).Value = "not found!!"
        End If
    Next
End Sub
demo8

voila

ça devrait fonctionner chez toi aussi

Rechercher des sujets similaires à "extraction cours bourse code html sicavonline"