IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Import Page WEB en VBA : Récupération partielle du code source


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut Import Page WEB en VBA : Récupération partielle du code source
    Bonjour,

    Je souhaite récupérér les données issu d'une page web :
    http://81.248.141.204:8002/index.html

    Un tableau sur la droite indique les valeurs que je souhaite relire.

    J'ai utilisé, il me semble les codes sources disponibles ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    Public Sub closeInter()
        InternetCloseHandle (hSession)
    End Sub
    Sub test()
     
    'getweblog("http://81.248.22.106:3232/","C:")
     
    End Sub
     
     
    Sub GetWeblog()
     
    Dim url As String
    Dim strFic As String
     
    url = "http://81.248.22.106:3232/"
    strFic = "d:\rien.txt"
     
        ' pointeur du lien lien
        Dim hUrlFile As Long
        Dim bBoucle As Boolean
        ' bloc de lecture par buffer 4 096 caractères
        Dim sReadBuf As String * 4096
        Dim OctetsLus As Long
        ' pointeurs des fichiers
        Dim localFile As Long
        ' chronométrage du temps d'exécution
        Dim t0 As Single, t1 As Single
     
        t0 = GetTickCount()
     
        ' ouverture des ressources de navigation internet
        openInter
     
        ' désignation d'un pointeur de fichier libre
        localFile = FreeFile
     
        ' si le fichier existe déjà on l'efface
        If Len(Dir(strFic)) > 0 Then Kill strFic
     
        ' ouverture du fichier en mode binaire
        Open strFic For Binary As #localFile
     
        ' ouverture de l'url
        hUrlFile = InternetOpenUrl(hSession, url, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
     
        bBoucle = True
        While bBoucle
            sReadBuf = ""
            ' lecture par bloc de 4096 caractères
            bBoucle = InternetReadFile(hUrlFile, sReadBuf, 4096&, OctetsLus)
            ' écriture par bloc dans le fichier local
            Put #localFile, , Left(sReadBuf, OctetsLus)
            If OctetsLus = 0 Then bBoucle = False
            DoEvents
        Wend
        ' fermeture du fichier local
        Close #localFile
        ' fermeture des ressources de navigation
        closeInter
     
        t1 = GetTickCount()
        Debug.Print "téléchargement du xml : "; Format((t1 - t0) / 1000, "0.000") & " s"
     
        ' parsing XML du fichier nous verrons ce point plus tard dans l'article
        'xmlParser strFic
     
    End Sub
    Hors je ne reçois vraiment qu'une partie du code source de la page, je ne comprends pas..
    Ou je ne comprends pas le découpage de la page web.
    Lorsque dans l'espion de variable, je regarde l'objet Html récupérer, je ne vois vraiment nulle part les données qui m’intéresse.

    Le résultat de d:\rien.text est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Sunny WebBox</title>
        </head>
        <frameset rows="75,*,22" frameborder="no" border="2" framespacing="0">
            <frame src="top.htm" name="topFrame" scrolling="NO" topmargin="0" leftmargin="0" marginheight="0"
                marginwidth="0" noresize>
            <frame src="home_frameset.htm" name="mainFrame" topmargin="0" leftmargin="0" marginheight="0"
                marginwidth="0">
            <frame src="bottom.htm" name="bottomFrame" scrolling="NO" topmargin="0" leftmargin="0"
                marginheight="0" marginwidth="0" noresize>
        </frameset>
    </html>
    Je cherche depuis hier, et je ne vois vraiment rien, quelque chose doit m'échapper.
    Hors lors de la lecture du code source depuis IE, je vois bien tout ce qui m’intéresse...


    Please Help :o

  2. #2
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut
    Désolé de Up un peu le sujet, mais j'apporte des éléments de réfelxion suite à mes essais :

    _ Je n'arrive pas à récupérer l'objet en utilisant la méthode GetElementsbyId or Name
    _ Dans le document IE.document récupéré, j'ai l'impression de me retrouver dans des poupées russes
    _ Le problème me semble provenir de la décomposition en frame de la page, mais que je ne retrouve pas du tout dans le document HTML récupéré par code

    Pourtant avec IE lorsque je demande de récupérer le code source, j'ai bien tout ce qu'il me faut, je ne comprends pas ne pas arriver à reproduire ce qu'IE fait en deux clics....

    Merci vraiment de m'aider, c'est un petit projet qu'il faut que je termine avant de quitter ce poste.

  3. #3
    Membre éclairé Avatar de verredewhisky
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Janvier 2013
    Messages : 63
    Par défaut Exemple de code en PHP pour inspiration
    Hello, j'ai un exemple ici de code php qui copie un tableau d'une page html.
    Le concept est de filtrer ton code source html au moyen de filtres pour récupérer les infos qui t'intéressent. Les filtres utilisent les regex et les fonctions php preg_match et preg_match_all. C'est une façon différente d'attaquer le problème.

    Je débute avec le virtual basic mais je pense qu'il doit exister des fonctions similaires.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
     
    '// L'adresse vers lequel pointe le script.
    $fichier_depart = "http://www.tunnel.com/index.html";
     
    '// Récupération du contenu de la page
    $fichier = file_get_contents($fichier_depart);
     
    '// Filtrage sur le tableau que je veux pomper (supposons que le page web en question à un tableau dont tu souhaites récupérer  les données par exemple).
    preg_match("#T\.D\. Application(.+)tableau que je veux pomper(.+)</table>#Usi", $fichier, $retour);
    $contenu = $retour[1];
     
     
    '// Filtrage des entrées une à une que je veux pomper
    $filtre = "#<tr align=left><td align=middle> <font size=2 color=(?:.+) face=Arial>(.+)</td><td align=middle><font size=2 color=(?:.+) face=Arial>(.+)</font></td><td align=middle><font size=2 color=(?:.+) face=Arial>(.+)</td><td align=middle><font size=2 color=(?:.+) face=Arial>(.+)</td><td align=middle><font size=2 color=(?:.+) face=Arial>(.+)</td><td align=middle><font size=2 color=(?:.+) face=Arial>(.+)</td></tr>'."\n".'#Usi";
    preg_match_all($filtre, $contenu, $retour);
     
    '// Attribution des informations du tableau sur des variables
    $pseudos = $retour[1];
    $status = $retour[2];
    ...
     
    //...
    ?>

  4. #4
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut
    Merci pour l'aide,

    Par contre je ne comprends rien au php ^^
    Des fonctions similaires telles que GetelementById semblerait faire la même démarché, mais cela ne marche pas, ne récupérant pas le code source.

    Je ne suis pas contre attaquer le problème avec du php, mais comment l'utiliser et le lancer afin soit :
    - D'être lancé depuis une commande vba
    - Etre lancé via IE et donnant comme résultat un fichier texte par exemple (ce dernier je l'exploiterais ainsi depuis vba)

    Ca je ne le maitrise pas du tout.
    Et ca me permettrait de tester ton bout de code et m'experimenter au php.

  5. #5
    Membre éclairé Avatar de verredewhisky
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Janvier 2013
    Messages : 63
    Par défaut Ah PHP mon language préféré!
    Ah PHP mon language préféré!

    C'est un language pour serveur. Tu l'insères dans tes pages html. Il te faut un serveur si tu veux l'utiliser. tu peux soit utiliser un serveur fictif sur ton ordi (WAMPSERVER par exemple) soit trouver un véritable hébergeur de site web et faire tourner ton script en live sur la toile.

    page d'accueil (index.html) avec du code PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
        session_start();
    ?>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
     
    <title>Accueil</title>
     
    <?php include('meta.php'); include('lib/visiteurs.php'); 
            echo'<link href="liste.css" rel="stylesheet" type="text/css" />';
    ?>
     
    </head>
    '...
    Voilà voilà. Sinon si tu veux travailler sur excel tas plutôt intérêt à rester en virtual basic.

    GetelementById() sert à trouver les balises html avec une id. Tu ne peux pas utiliser cette fonction vu que tu sais pas à l'avance si le webmaster a utilisé des id et comment il les a nommées. Exemple : une balise div avec l'id primaryContentContainer :
    <div id="primaryContentContainer">

    Je pense que tu es obligé de passer par une regex (expression régulière). PHP utilise les expressions régulières rapides et performantes PCRE, issues d'un autre langage (le Perl). Je sais pas si ça existe en virtual basic.

    Une jolie regex :
    #(((https?|ftp)://(w{3}\.)?)(?<\!www)(\w+-?)*\.([a-z]{2,4}))#

  6. #6
    Membre éclairé Avatar de verredewhisky
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Janvier 2013
    Messages : 63
    Par défaut regex vba
    Voilà les regex vba :

    Attention tu dois cocher "Microsoft VBScript Regular Expressions 5.5" dans "Outils\Références".

    Supprimer toutes les balises HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Sub RegexChaine()
        Dim RegEx As RegExp
        Set RegEx = New RegExp
        With RegEx
            .IgnoreCase = True
            .Global = False
            .Pattern = "<.*>(.*)<.*>"
        End With
        chaine$ = "Test regex VB pour <balise1>Bobby</balise1>."
        chaine$ = RegEx.Replace(chaine$, "$1")
        MsgBox (chaine$)
        ' Affiche : "Test regex VB pour Bobby." (sans les balises)
    End Sub
    Extraire un mot inconnu qui en précède un autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub RegexExtraction()
        Dim RegEx As RegExp
        Set RegEx = New RegExp
        With RegEx
            .IgnoreCase = True
            .Global = False
            .Pattern = "[a-z]* Bobby"
        End With
        chaine$ = "Test regex VB de Bobby le buveur de whisky."
        chaine$ = RegEx.Replace(chaine$, "$1")
        MsgBox (chaine$)
        ' Affiche : "de Bobby"
    End Sub
    Avec ça tu dois pouvoir trouver tout que tu veux dans ta page html !

    Il y a un tuto sur le sujet : Les Expressions Rationnelles et Access par la pratique


    Bonne soirée

  7. #7
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut
    Re,

    unverredewhisky, déjà que je t'ai croisé à plusieurs reprises durant le week-end, je te retrouve ce lundi !
    Bon tu me donnes au propre également quelques maux de têtes... mais ceux-là sont salutaires, merci

    J'ai compris le principe des RegEx qui me permettra de retrouver ma valeur facilement.
    Par contre, mon problème de récupérer les données d'entrées lui est toujours présent, non ?

    Car si je comprend bien, je pourrais utiliser la regex que si j'arrive à récupérer tout le code html de la page, chose sur laquelle je bute !

    Et je bute car la page est constitué de plusieurs frames et je n'obtiens toujours que le frameset...

  8. #8
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut
    Et bien !

    Un week-end et je trouve mes données, mais vraiment pas de manière simple...
    En explorant à nouveau l'espion de variables VBA j'ai trouvé une partie de ce que je recherche dans une variable qui devrait donner ca :

    Littéralement dans l'espion, ca me donne ca :

    mapagehtml.all.item8.contentdocument.all.item8.contentdocument.all.item16.innertext

    Par contre, je n'arrive pas du tout à réécrire la bonne syntaxe de la variable dans mon code.
    Je continue à cherche son exploitation, j'ai essayé item7 ou item(7) à la place de item8 mais sans succès...
    Si vous aviez une astuce pour un utilisateur occasionnel comme moi.

  9. #9
    Membre éclairé Avatar de verredewhisky
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Janvier 2013
    Messages : 63
    Par défaut
    Salut ! Tu peux montrer ton code ?

  10. #10
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Par défaut
    Je suis arrivé au bout de mes peines !
    Avec un code bien moche comme il faut !

    J'ai réussi à mettre à nu cette petite russe
    Bon certainement il y a mieux, je serais toujours preneur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Private Sub IE_en_Mode_Poupée_Russe()
     
    Set IE = New InternetExplorer
     IE.Visible = True
    IE.navigate ("http://81.248.141.204:8001/")
     
     
    Do While IE.Busy
    Application.Wait Now + 0.1 / 3600 / 24
    Loop
    Application.Wait Now + 2 / 3600 / 24
    IE.Visible = True
     
     Dim pDoc As MSHTML.HTMLDocument
     Dim pFrame As MSHTML.HTMLFrameElement
     Dim ptab As MSHTML.HTMLTable
     
        Set pDoc = IE.document
        Set pFrame = pDoc.all("mainframe")
        Application.Wait Now + 2 / 3600 / 24
        Set pDoc = pFrame.contentDocument
        Application.Wait Now + 2 / 3600 / 24
        Set pFrame = pDoc.all("home")
        Set pDoc = pFrame.contentDocument
        Application.Wait Now + 2 / 3600 / 24
        Set ptab = pDoc.all("table")
        Set ptab = pDoc.getElementById("Table1")
     
    Dim pcell As MSHTML.HTMLTableCell
     
    Dim tabData(0, 2)
    Set pcell = ptab.all("Power")
    tabData(0, 0) = pcell.innerText
    Set pcell = ptab.all("DailyYield")
    tabData(0, 1) = pcell.innerText
    Set pcell = ptab.all("TotalYield")
    tabData(0, 2) = pcell.innerText
     
    IE.Quit
     
    For i = 0 To 2
    MsgBox tabData(0, i)
    Next
     
    End Sub
    Ne me reste plus qu'à faire tourner ce code sur l'ensemble de mes sites pour faire un panneau d'affichage de cette efficacité énergétique !
    J'espère que ca ne prendra pas trois mois pour faire économiser l'énergie dépenser par mon Pc pour générer cet affichage futur !

    Merci en tout cas à toi unverredewhisky, j'ai faillit finir noyé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire des données d'une page Web en VBA sous Excel
    Par BEMI dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/05/2009, 07h24
  2. Réponses: 5
    Dernier message: 21/03/2009, 18h33
  3. Manipulation de formulaires et pages web en vba
    Par PSEUDOMONASSE dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/01/2009, 16h32
  4. import page web dans un champ memo puis extration de texte
    Par pascalourox dans le forum VBA Access
    Réponses: 5
    Dernier message: 22/04/2008, 14h54
  5. Confirmer une fermeture de session d'une page Web en VBA?
    Par pegase33 dans le forum Général VBA
    Réponses: 2
    Dernier message: 05/09/2006, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo