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

VBA Access Discussion :

Recopier l'intégralité du code source d'une page web html dans une table [AC-2016]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut Recopier l'intégralité du code source d'une page web html dans une table
    Bonjour

    Je sais que la question a déjà été abordée, y compris par moi, sous plusieurs formes, avec plusieurs situations et plusieurs solutions.

    Si je me permets de la reposer, c'est uniquement parce que je n'arrive pas à mettre en œuvre la littérature que j'ai pu trouver jusqu'à présent :
    • Soit le résultat escompté n'est pas atteint,
    • Soit ça ne fonctionne pas comme ça à l'air de devoir fonctionner
    • Soit ça ne fonctionne pas du tout
    • Soit je ne sais même pas par où commencer pour mettre en œuvre le code trouvé.

    J'avais déjà ouvert une discussion pour récupérer des liens internet dans le code source d'une page.

    Ces liens sont présentés dans ce que j'ai pu identifier par la suite comme un tableau.

    Mais, il semble qu'il existe aussi un moyen de récupérer des données présentées sous forme d'une table HTML.

    Le souci, c'est que cette méthode génère une erreur dans mon cas de figure.

    J'ai depuis découvert que la page de code source des page web peut receler plus d'informations que ce qui est affiché, qu'elles soient présentées sous forme de table ou sous tout autre forme…

    En utilisant copier/coller, Word, Excel, Rechercher et remplacer, Access, J'arrive à :
    - Afficher le code source de la page
    - Faire un copier/coller de ce code source dans un document texte (Word)
    - Retirer le début et la fin "d'intérêt limité"
    - Supprimer toutes les lignes blanches
    - Supprimer toutes les lignes avec juste du code "sans intérêt"
    - Regrouper les infos d'un même "enregistrement" sur une seule ligne
    - Repartir les infos utiles dans des champs distincts

    Et ce, par des vagues de traitement successifs, chaque traitement appliqué de manière à ne générer aucun risque de mélanger ou perdre de l'information (je ne me contente pas de sélectionner l'info qui m'intéresse et la copier ailleurs, ligne par ligne…)

    Je pense qu'il doit être possible de produire quelque chose d'équivalent uniquement avec Access, des fonctions simples de traitement des chaines de caractères.

    A titre d'exemple et pourquoi pas de base de travail, j'ai trouvé ce site :

    https://www.afpa.fr/centres-formatio...-pas-de-calais

    On découvre une carte avec un point par centre de formation.

    Ensuite on a une liste des centres avec leurs coordonnées Postales et téléphoniques.

    On peut récupérer ces données par Copier/Coller

    Mais ce n'est pas le mieux.

    Quand on consulte le code source :
    http://view-source:https://www.afpa....-pas-de-calais

    On retrouve les infos des centres, regroupées sur plusieurs lignes par centre, mais toujours avec la même structure.

    Chaque information est toujours au même endroit.

    Mais en plus, on découvre les coordonnées GPS de chaque centre, non pas regroupées en un seul endroit comme le laissait penser la carte en début de page, mais bien associés à leurs centres respectifs.

    Cette nouvelle donnée est très intéressante pour les SIG (Systèmes d'Information Géographique).

    J'ai des exemples encore plus flagrants de données "cachées" dans le code source d'une page d'information, mais je ne peux pas partager ces liens sur le forum.

    Dans un premier temps j'aimerais arriver à recopier l'intégralité de la page de code source dans une table à champ unique, à raison d'un enregistrement par ligne de code.

    Comme préconisé en son temps par titi95 dans le topic https://www.developpez.net/forums/d1.../#post10082267

    Mais il faudrait que cette copie soit automatisée et complète.

    J'ai bien sûr effectué des recherches et trouvé des réponses à cette possibilité.

    Mais comme indiqué précédemment, je ne suis pas arrivé à les adapter à la situation du moment.

    En fait, j'aimerais bien au moins tester un formulaire avec un bouton qui déclencherait la copie du code d'une page indiqué dans une table indiquée.

    Et oui, même cela, je n'y arrive pas…

    J'ai du mal à repérer le code qui pourrait être utile quand il est au milieu d'autre code pensé pour d'autres actions.

    Je suis conscient qu'éplucher des pages de code pour trouver des infos, ce n'est pas le mieux.

    Mais je reste convaincu qu'une fois qu'on a trouvé comment elles sont présentées, on peut appliquer un traitement qui permet de récupérer des données de manière fiable (j'entends par là que les données sont fiables, même si la méthode est archaïque)

    D'avance merci.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    j'ai trouve cela qui a le merite d'etre assez detaille.
    c'est pour excel mais la conversion pour Access devrait etre assez facile.

    Note qu'en HTML il n'y a pas de notion de ligne. Il y a des balises de debut et des balises de fin qui delimitent de l'information.
    Les retours a la ligne ne correspondent pas a des divisions du langage, c'est juste pour les humains.
    Donc une meme info HTML peut etre repartie sur plusieurs lignes et si tu decoupes sur le retour chariot, tu vas "casser" ton info.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonsoir marot_r.

    Merci pour votre indéfectible soutient.


    Citation Envoyé par marot_r Voir le message
    Bonjour.

    j'ai trouve cela qui a le merite d'etre assez detaille.
    c'est pour excel mais la conversion pour Access devrait etre assez facile.

    Pardon, mais ne manque-t-il pas un lien dans cette première de vos réponse ?

    Par ailleurs, les rares fois où j'ai trouvé du VBA pour Excel, il était pensé pour remplir des cellules... et je n'ai jamais su basculer vers des enregistrements.

    D'autre part, certaines fonctions ne semble pas exister sous Access, ou pas fonctionner pareil, ou pas avec la même orthographe... J'ai eu de problèmes avec ça aussi.

    Je vais regarder.

    Citation Envoyé par marot_r Voir le message
    Note qu'en HTML il n'y a pas de notion de ligne. Il y a des balises de debut et des balises de fin qui delimitent de l'information.
    Les retours a la ligne ne correspondent pas a des divisions du langage, c'est juste pour les humains.
    Donc une meme info HTML peut etre repartie sur plusieurs lignes et si tu decoupes sur le retour chariot, tu vas "casser" ton info
    A+
    C'est une remarque fort judicieuse qui m'a déjà été faite. Peut-être même par vous...

    Dans un monde parfait, le code serait comme une ligne d'un kilomètre de long avec des balises...

    Mais je n'ai trouvé aucun site avec un code présenté de la sorte.

    Systématiquement, le code se présente sur plusieurs lignes et les données sur une ou plusieurs lignes.

    Heureusement, ai-je envie de dire, celui qui m’intéresse est aussi sur plusieurs lignes.

    Quand on le copie et qu'on le colle il reste sur plusieurs ligne et on peut le traiter comme tel.

    Après je veux bien accepter que les programmes qui lisent le HTML le lisent au km.

    Si les seules solutions adaptables à Access lisent aussi le HTML au km, alors il faudra faire un champ unique, capable de stocker des dizaines de milliers de caractères.

    Ou bien revenir sur votre méthode qui découpe le HTML (Mais que je n'ai malheureusement jamais réussi à faire prendre une page entière...)

    Quand bien même, j'aimerais pouvoir tenter le coup, pour voir...

    Encore merci.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Oui, j'ai oublie de copier le lien. Je vais tache de le retrouver.

    Si on peut sortir vers une cellule, on peut ecrire dans un enregistrement c'est assez direct comme modif, on remplace l'assignation a la cellule par un addnew/update du recodrset.

    Ou bien revenir sur votre méthode qui découpe le HTML (Mais que je n'ai malheureusement jamais réussi à faire prendre une page entière...)
    Oui le point delicat est de recuperer TOUT le HTML, apres l'enregistrement et le reste c'est assez facile.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour

    Citation Envoyé par marot_r Voir le message
    Bonjour.
    Oui, j'ai oublie de copier le lien. Je vais tache de le retrouver.

    Si on peut sortir vers une cellule, on peut ecrire dans un enregistrement c'est assez direct comme modif, on remplace l'assignation a la cellule par un addnew/update du recodrset.[…]
    Bon, bin ça, on va en reparler du coup…

    Citation Envoyé par marot_r Voir le message
    […]
    Oui le point delicat est de recuperer TOUT le HTML, apres l'enregistrement et le reste c'est assez facile.
    A+
    Alors, à ce sujet, je souhaiterais pouvoir me prosterner à vos pieds et implorer votre pardon…

    Et si je pouvais, j'irais aussi me prosterner aux pieds des intervenant du topic précédent cité en début de cette discussion.

    J'ai commencé à suivre https://www.wiseowl.co.uk/blog/s393/...bsite-html.htm

    Effectivement, c'est bien détaillé.

    Mais dès le début, "Here a subroutine to get at the text behind a web page:" ça produisait le même résultat : il manquait une bonne partie du HTML.

    Bon, comme c'était une message box, je me suis dit que la taille de la message box ne permettait pas de tout afficher.

    J'ai donc tenté un un Debug.Print.

    Là, j'ai eu plus de données, mais très très loin d'avoir tout.

    Par contre, comme à chaque fois jusqu'à présent, MsgBox ou fenêtre d'exécution, le code est présenté avec des retours chariot.

    Pourtant, le site continuait son explication comme si de rien était.

    Il devait bien, à coup sûr, y avoir une possibilité de mettre la main sur la totalité du code pour l'exploiter comme ils le proposaient…

    Dieu seul sait pour quoi, j'en suis arrivé à l'idée de mettre en œuvre un formulaire avec un champ non lié à une table, dans lequel le code serait écrit…

    Et là, j'ai tout………………

    Les 900 pages de code…

    J'ai même du code qui n'apparait pas lors de l'affichage du code source de la page web dans l'explorateur…

    Et sans retours chariot… Effectivement, tout est bout à bout…

    Je vous prie de bien vouloir accepter toutes mes plus sincères excuses…

    Oui, tout est là, et devait certainement y être depuis le début.

    Mais le fait est que, pour contrôler l'avancement des opérations à l'époque, je n'utilisais que le Debug.Print…

    Du coup, je ne voyais qu'un bout…

    Désolé...

    Et encore un immense merci.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Alors, maintenant que je sais que j'ai tout, il faut que j'en fasse quelque chose.

    Alléger le texte :

    Il faudrait donc par commencer par supprimer tout ce qui n'est pas utile au début et à la fin du code.

    J'ai donc tenté d'utiliser cette bidouille qui fonctionne bien d'habitude :

    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
    Public Function EXTRAC_BALISE(PrmChamp As String, PrmBlsLft As String, PrmBlsRght As String, PrmWay As String)
    'Le texte qui sert de balise peut être présent à 2 ou trois reprises avant le texte à extraire et de même après ce même texte.
    'Mais si ce texte n'est présent qu'une seule fois, soit au début, soit à la fin du texte à extraire, alors on peut choisir le sens de recherche dans le texte, pour commencer par le côté
    'pour lequel le texte "balise" n'est présent qu'une fois et donc, dans ce même sens, trouver la première occurence du texte balise recherché de l'autre côt" du texte à extraire...
     
    'Avec ce système, il est possible de pointer un seul caractère comme texte balise, présent de multiples fois, mais qui n'apparaitra pour la première fois dans le sens de lecture
     
    'ATTENTION: La lecture se fait toujours depuis l'extrémité du champ analysé et non pas depuis la première balise trouvée
    'ATTENTION: Les chaines de caractères à rercherche ne doivent pas contenir des signes comme < ou =., ou alors il faut les remplacer par une concaténation et un Car(nn)
     
    'PrmChamp As String : Le nom du champ à opérer
    'PrmBlsLft As String : Le texte utilisé comme "balise" au début du texte à extraire
    'PrmBlsRght As String : Le texte utilisé comme "balise" à la fin du texte à extraire
    'PrmWay As String : Sens de recherche des "balises" dans le champ : Left pour une recherche depuis le début du champ, Right pour une recherche depuis la fin du champ
     
    If PrmWay = "Left" Then 'On recherche les "balises" depuis début du champ
    EXTRAC_BALISE = Mid(PrmChamp, InStr(PrmChamp, PrmBlsLft) + Len(PrmBlsLft), InStr(PrmChamp, PrmBlsRght) - (InStr(PrmChamp, PrmBlsLft) + Len(PrmBlsLft)))
    ElseIf PrmWay = "Right" Then 'On recherche les "balises" depuis la fin du champ
    EXTRAC_BALISE = Mid(PrmChamp, InStrRev(PrmChamp, PrmBlsLft) + Len(PrmBlsLft), InStrRev(PrmChamp, PrmBlsRght) - (InStrRev(PrmChamp, PrmBlsLft) + Len(PrmBlsLft)))
    End If
    End Function
    Je l'ai insérée dans la toute première partie du code que vous avez proposé en lien.

    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
    Private Sub Form_Open(Cancel As Integer)
    'Sub ImportStackOverflowData()
    Dim PrmVeryLongTxt As String
    'to refer to the running copy of Internet Explorer
    Dim ie As InternetExplorer
    'to refer to the HTML document returned
    Dim html As HTMLDocument
    'open Internet Explorer in memory, and go to website
    Set ie = New InternetExplorer
    ie.Visible = False
    ie.Navigate "http://www.Exemple.Page.web"
    'Wait until IE is done loading page
    Do While ie.ReadyState <> READYSTATE_COMPLETE
    'Application.StatusBar = "Trying to go to StackOverflow ..."
    DoEvents
    Loop
    'show text of HTML document returned
    Set html = ie.Document
    PrmVeryLongTxt = html.documentElement.innerHTML
    Me.Champ_test.Value = EXTRAC_BALISE(PrmVeryLongTxt, "Exemple Texte Début", "Exemple Texte Fin", "Left")
    Set ie = Nothing
    End Sub
    Du coup, j'ai un formulaire avec un contrôle unique et le contenu de ma page HTML, sans le début et la fin qui ne me servent à rien, c'est bien.

    Scinder le texte en enregistrements, observations :

    A des fins d'analyse, j'ai pu relancer une extraction en utilisant des morceaux de textes choisis pour n'avoir que quelques lignes de code.

    C'est plus rapide et plus simple ensuite de manipuler le résultat.

    Il se trouve que même si le résultat est en une seule ligne, un copier-coller vers un éditeur de texte donne une mise en page avec des retours à la ligne

    Quand il est encore présenté sur le formulaire, on peut repérer dans le texte récupéré, des espaces plus larges là où apparaitrons les retours à la ligne quand on fera un copier/coller.

    Je pense qu'il s'agit de caractères spéciaux, mais je ne sais pas encore lesquels (j'ai tenté de rechercher Chr(10) 11 et 13, ^10, ^11, ^13, sans succès).

    Par ailleurs, il se trouve qu'un texte apparait entre chaque enregistrement.

    Scinder le texte en enregistrements, actions (souhaitée) :


    En faisant un copier/coller du code vers un document Word, j'ai réussi à remplacer ce texte par un retour chariot et ainsi avoir un document prêt à l'importation.

    Je me disais que je pouvais le pointer pour demander à Access de recopier ce monumental bloc de texte dans une table, en changeant d'enregistrement à chaque fois qu'il trouvait le texte.

    Ou supprimer tous les retours chariots, sous quelques formes qu'ils soient, pour les remplacer par un retour chariot uniquement à la place du texte "repère" et ensuite lancer l'import.

    Il faudrait pouvoir "entreposer" le texte quelque-part, en interne d'Access de préférence, pour le formater et ensuite l'importer.

    Ou bien il faudrait reprendre vos propositions de l'autre discussion.

    Vous aviez indiqué des solutions qui tronçonnaient bien le code.

    Mais comme on ne pouvait suivre le résultat que dans la fenêtre d'exécution, on ne voyait pas tout (et en plus, une fois dans la fenêtre d’exécution, je ne voyais pas comment en faire une table...).

    Est-il possible de créer une fonction du style :

    Transferthtmltotable (code_source ; texte_séparateur de champ ; texte_sépareteur d'enregistrement)

    En fait, j'ai bien compris que le HTML était un langage avec balise :

    Exemple : <balise> texte </balise>

    Mais il semble que ce soit un langage permissif.

    Du coup, on peut trouver <balise> texte </uneautrebalise>

    Mais dans le cas présent, on pourrait faire, pour un enregistrement

    <unebalisepeuimporte> Texte </balisetoujourslamême><balisetoujourslamême> texte </balisetoujourslamême><balisetoujourslamême> texte </balisetoujourslamême><balisetoujourslamême> texte </uneautrebalisepeuimporte> OU </balisefind'enregistrement>

    Simplifié à :

    Texte </balisetoujourslamême><balisetoujourslamême> texte </balisetoujourslamême><balisetoujourslamême> texte </balisetoujourslamême><balisetoujourslamême> texte </balisefind'enregistrement>

    Puis à :

    Texte # texte # texte # texte/retour chariot

    Prêt à importer, # séparateur de champ.

    Encore un immense merci.

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    En fait HTML en tant que tel n'est pas permissif mais les 1ere implentations se sont assises joyeusement dessus et les ont implementer "au plus efficace" en tolerant des entorses aux regles.

    Et il peut y avoir des balises "gigognes" qui se contiennent elle-meme (ex : un tableau dans une cellule de tableau).

    Bon a savoir que Debug.Print n'affiche pas toujours tout. C'est ettonant. Il y a peut-etre in caractere qui "coupe" le texte avant la fin (genre chr(0) ou chr(26) (Fin de fichier) ou alors l'ecran n'a pas ete rafraichi.
    Pour le rafraichissement j'ajoute maintenant toujours in DoEvents apres mes Debug.Print. Ca donne in truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.print "toto" : DoEvents.
    Pour savoir quel est ton code special tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print asc(mid(TonTexte, LaPositionDuCaractereSpecial, 1))
    Cela va te donner le code ascii du caractere correspondant.

    Personnellement j'aurai pense que c'est chr(10) (linefeed) car il n'est pas pris en compte par Access qui attend Chr(10) & chr(13) pour faire un retour a la ligne.

    Delose je n'ai pas compris ce que tu veux faire. Est-ce extraire le texte entre deux balises specifiques pour toutes les occurances de cette balise ?

    Et tu pourais peut-etre regarder du cote des objets qui manipulent des fichiers XML si ton fichier source est bien balise, un fichier HTML est un sous-ensemble de XML. (Pour etre exact XML est un sur-ensemble de HTML puisque HTML qui etait la avant.)
    Les librairire qui manipulent XML te permettent de te "balader" dans les balises plus facilement, le decoupage etant deja fait.
    Il faudra peut-etre ajouter des balises specifiques au debut et a la fin pour "transformer" ton fichier HTML en XML et probablement changer l'extention.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour et merci pour ce suivi.

    Alors, je n'ai pas encore testé le Debug.Print que vous proposez.
    Mais j'y jetterais un œil.

    Je suis arrivé à mes fins et je rendait le code un peu plus propre pour le présenter ici.

    Le résultat utilise la création d'un fichier .txt temporaire.

    Toute la mise en forme se fait dans ce fichier via VBA.

    C'est cela que je voulais éviter, en faisant la mise en forme en interne d'Access.

    Par ailleurs, pour télécharger plusieurs milliers de lignes, il faut un peu de temps (15 sec environs).

    J'utilise toujours le même fichier texte comme "temporaire".

    Le résultat est tout à fait conforme à mes attentes, sauf que j'aurais préféré que cela se fasse sans fichier .txt.

    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
    Public Function EXTRAC_BALISE(PrmChamp As String, PrmBlsLft As String, PrmBlsRght As String, PrmWay As String)
    'Pour extraire du texte enchassé entre deux autres textes
     
    'Le texte qui sert de balise peut être présent à 2 ou trois reprises avant le texte à extraire et de même après ce même texte.
    'Mais si ce texte n'est présent qu'une seule fois, soit au début, soit à la fin du texte à extraire, alors on peut choisir le sens de recherche dans le texte, pour commencer par le côté
    'pour lequel le texte "balise" n'est présent qu'une fois et donc, dans ce même sens, trouver la première occurrence du texte balise recherché de l'autre côté du texte à extraire...
     
    'Avec ce système, il est possible de pointer un seul caractère comme texte balise, présent de multiples fois, mais qui n'apparaitra pour la première fois dans le sens de lecture
     
    'ATTENTION: La lecture se fait toujours depuis l'extrémité du champ analysé et non pas depuis la première balise trouvée
    'ATTENTION: Les chaines de caractères à rercherche ne doivent pas contenir des signes comme < ou =., ou alors il faut les remplacer par une concaténation et un Car(nn)
     
    'PrmChamp As String : Le nom du champ à opérer
    'PrmBlsLft As String : Le texte utilisé comme "balise" au début du texte à extraire
    'PrmBlsRght As String : Le texte utilisé comme "balise" à la fin du texte à extraire
    'PrmWay As String : Sens de recherche des "balises" dans le champ : Left pour une recherche depuis le début du champ, Right pour une recherche depuis la fin du champ
     
    If PrmWay = "Left" Then 'On recherche les "balises" depuis début du champ
    EXTRAC_BALISE = Mid(PrmChamp, InStr(PrmChamp, PrmBlsLft) + Len(PrmBlsLft), InStr(PrmChamp, PrmBlsRght) - (InStr(PrmChamp, PrmBlsLft) + Len(PrmBlsLft)))
     
    ElseIf PrmWay = "Right" Then 'On recherche les "balises" depuis la fin du champ
    EXTRAC_BALISE = Mid(PrmChamp, InStrRev(PrmChamp, PrmBlsLft) + Len(PrmBlsLft), InStrRev(PrmChamp, PrmBlsRght) - (InStrRev(PrmChamp, PrmBlsLft) + Len(PrmBlsLft)))
     
    End If
     
    End Function

    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
    69
    70
    71
     Public Sub COPIE_HTML_TXT_FILE(PrmURL As String, PrmTxtBgn As String, PrmTxtEnd As String, PrmFolderPath As String, PrmFileName As String)
    'Pour extraire du HTML et l'écrire dans un fichier texte temporaire placé dans le répertoire "Téléchargements"
     
    'MERCI Team Access
    'https://access.developpez.com/faq/?page=ActionsRep#EcrFicTxt
    'MERCI marot_r
    'https://www.developpez.net/forums/d1868593/logiciels/microsoft-office/access/vba-access/recopier-l-integralite-code-source-d-page-web-html-table/#post10330285
    'MERCI marot_r
    'MERCI titi95
    'https://www.developpez.net/forums/d1827702/logiciels/microsoft-office/access/vba-access/recuperer-liens-page-web-recuperant-code-page/#post10082267
    'MERCI Andy Brown
    'https://www.wiseowl.co.uk/blog/s393/scrape-website-html.htm
     
    'PrmURL : L'adresse web
    'PrmTxtBgn : Le texte repéré au début du code pertinent
    'PrmTxtEnd : Le Texte répéré à la fin du code pertinent
    'PrmFolderPath : Chemin d'accès du dossier où le document doit-être créé
    'PrmFileName : Le nom du fichier txt sans .txt à la fin
     
    Dim PrmVeryLongHTML As String
    'Pour stocker le code brut
    Dim PrmVeryLongTXT As String
    'Pour stocker le code sans les entêtes
     
    'to refer to the running copy of Internet Explorer
    Dim ie As InternetExplorer
     
    'to refer to the HTML document returned
    Dim html As HTMLDocument
     
    'open Internet Explorer in memory, and go to website
    Set ie = New InternetExplorer
     
    ie.Visible = False
     
    ie.Navigate PrmURL
     
    'Wait until IE is done loading page
    Do While ie.ReadyState <> READYSTATE_COMPLETE
     
    '--- Ne concerne qu'EXCEL : --- Application.StatusBar = "Trying to go to StackOverflow ..."
     
    DoEvents
     
    Loop
     
    'show text of HTML document returned
    Set html = ie.Document
     
    PrmVeryLongHTML = html.documentElement.innerHTML
     
    '##### POUR EXEMPLE : ##### Me.Champ_test.Value = EXTRAC_BALISE(PrmVeryLongTxt, "Exemple Texte Début", "Exemple Texte Fin", "Left")
     
    '--- Ne concerne qu'EXCEL : --- Application.StatusBar = ""
     
    'close down IE and reset status bar
    Set ie = Nothing
     
    'On ne garde du code que la partie médiane interessante
    PrmVeryLongTXT = EXTRAC_BALISE(PrmVeryLongHTML, PrmTxtBgn, PrmTxtEnd, "Left")
     
    'On écrit le code récupéré dans un fichier texte créé en même temps ou remplacé dans le dossier Téléchargement (pour que ça aille plus vite que dans le dossier de la base qui est en réseau)
    Open PrmFolderPath & "\" & PrmFileName & ".txt" For Output As #1
    'Adresse du fichier
    Print #1, PrmVeryLongTXT
    'Contenu à écrire
    Close #1
     
    Noisy_Follow
    'Sert à emettre un bip
    End Sub
    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
    Public Function CLEAN_HTML_TXT(PrmFilePath As String, PrmTxtSprtrRcrds As String, PrmTxtSprtrFlds As String)
    'Ménage du contenu d'un fichier TXT pour mise en forme avant import.
     
    'PrmFilePath : Chemin d'accès complet avec nom du fichier à importer
    'PrmTxtSprtrRcrds : Texte identifié et utilisé comme transition entre deux enregistrements et voué à être remplacé par retour chariot
    'PrmTxtSprtrFlds : Texte identifié et utlisé comme transition entre deux champs et voué à être remplacé par tabulation
     
    CTRL_H_TXT_FILE PrmFilePath, Chr(10), " "
    'Pour remplacer le retour chariot par rien (certains retours chariots ne sont pas au bon endroit)
     
    CTRL_H_TXT_FILE PrmFilePath, PrmTxtSprtrRcrds, Chr(10)
    'Pour remplacer le texte identifié et utilisé comme transition entre deux enregistrements par un retour chariot
     
    CTRL_H_TXT_FILE PrmFilePath, "   ", ""
    'Pour remplacer les gros pleins d'espaces par rien
     
    CTRL_H_TXT_FILE PrmFilePath, "  ", " "
    'Pour remplacer les doubles espaces par espace
     
    CTRL_H_TXT_FILE PrmFilePath, PrmTxtSprtrFlds, Chr(9)
    'Pour remplacer les balises </td> (fin d'un champ) par une tabulation
     
    End Function
    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
    Public Function CTRL_H_TXT_FILE(PrmFilePath As String, PrmOldTxt As String, PrmNewTxt As String)
    'Pour faire un recherche et remplace dans un fichier
     
    'MERCI ucfoutu Developpez.net
    'https://www.developpez.net/forums/d742492/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/chercher-fichier-texte-modifier/
     
    'PrmFilePath = chemin complet plus nom complet avec extension
    Dim Present As String
    Open PrmFilePath For Input As #1
    'Exemple: Present = Replace(Input(LOF(1), 1), "a", "##")
    Present = Replace(Input(LOF(1), 1), PrmOldTxt, PrmNewTxt)
    Close #1
    Open PrmFilePath For Output As #1
    Print #1, Present
    Close #1
    Noisy_Follow
    'Sert à emettre un bip
    End Function

    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
    Public Function IMPRT_HTML_TBL(PrmAdressWeb As String, PrmTxtDebut As String, PrmTxtFin As String, PrmSepEnrgstrmnt As String, PrmSepChamp As String, PrmNomTable As String)
    'Tout combiné en une seule fonction
     
    'PrmAdressWeb : L'adresse web
    'PrmTxtDebut : Le texte repéré au début du code pertinent
    'PrmTxtFin : Le Texte répéré à la fin du code pertinent
    'PrmSepEnrgstrmnt : Texte identifié et utilisé comme transition entre deux enregistrements et voué à être remplacé par retour chariot
    'PrmSepChamp : Texte identifié et utlisé comme transition entre deux champs et voué à être remplacé par tabulation
    'PrmNomTable : Le nom de la table à remplir
     
    '###### Pour récupérer le contenu pertinent de la page indiqué dans un document.txt ######
    COPIE_HTML_TXT_FILE PrmAdressWeb, PrmTxtDebut, PrmTxtFin, "C:\Users\"Identifiant_Windows"\Downloads", "IMPRT_HTML_TXT"
     
    '###### Patiente jusqu'à ce que le fichier soit présent sur le disque dur ######
    'Merci nicolas2603
    'https://www.developpez.net/forums/d507702/logiciels/microsoft-office/access/vba-access/attendre-creation-d-fichier-copier/
    Do While Dir("C:\Users\"Identifiant_Windows"\Downloads" & "\IMPRT_HTML_TXT.txt") = ""
       Loop
     
    '###### Ménage du contenu du fichier TXT pour mise en forme avant import ######
    Dim PrmFilePath_1 As String
    Dim PrmTxtSprtrRcrds_1 As String
    Dim PrmTxtSprtrFlds_1 As String
     
    PrmFilePath_1 = "C:\Users\"Identifiant_Windows"\Downloads" & "\IMPRT_HTML_TXT.txt"
    'Chemin d'accès complet avec nom du fichier à importer
    PrmTxtSprtrRcrds_1 = PrmSepEnrgstrmnt
    'Séparateur d'enregistrements
    PrmTxtSprtrFlds_1 = PrmSepChamp
    'Séparateur de champs
     
    CLEAN_HTML_TXT PrmFilePath_1, PrmTxtSprtrRcrds_1, PrmTxtSprtrFlds_1
     
    Pauseur (1)
     
    '###### On vide la table ######
    'Merci Gabout
    'https://www.developpez.net/forums/d335397/logiciels/microsoft-office/access/tables-vba-supprimer-enregistrements-d-table-vba/
    'Merci Frank
    'https://access.developpez.com/faq/?page=ModifTable#DeleteTable
    CurrentDb.Execute "Delete * from " & PrmNomTable
     
    '######On importe le fichier Txt dans la table, en utilisant les spécifications d'import créé lors d'un premier import manuel ######
    'Merci DMboup
    'https://access.developpez.com/faq/?page=ActionsRep#ImportFichier
    DoCmd.TransferText acImportDelim, "Prm_Accss_Imprt_Txt_Db", PrmNomTable, "C:\Users\"Identifiant_Windows"\Downloads" & "\IMPRT_HTML_TXT.txt"
    'Nom du format d'import, Nom de la table, nom du fichier
     
    End Function
    Prm_Accss_Imprt_Txt_Db est le nom que j'ai donné à la sauvegarde de mes paramètres d'import.

    J'ai créé exprès un fichier .txt avec beaucoup plus de champs Texte long que nécessaire, pour que le paramétrage d'import me propose plus de champs et que je puisse tous les indiquer comme texte long.

    Ainsi, même avec plus ou moins de champs, je peux toujours tout récupérer.

    Et on appelle la fonction avec les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMPRT_HTML_TBL "http://www.lesite.com", "texte de la fin de l'entête", "Texte du début de fin de page", "Texte repéré comme séparateur d'enregistrement", " Texte repéré comme séparateur de champ", "Nom de la table"
    Pour mon usage (Lnk_Users_All renvoi au lien internet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMPRT_HTML_TBL Lnk_Users_All, "tbody", "</table>", "<tr class", "</td>", "TB_IMPRT_USERS"
    Me donne une table avec plus de 3000 lignes et un champ par champ de la table HTML

    Ensuite, en utilisant une requête et de nouveau la fonction EXTRAC_BALISE, je peux créer une autre table avec seulement les informations intéressantes et plus une trace de ce vilain code HTML.

    Le plus gros est fait et les infos principales sont toutes récupérées, triées et présentées convenablement.

    Il reste que j'ai deux ou trois autres champ présenté comme cela :

    Texte inutile 1234 <a> texte utile des fois </a> Texte inutile 1234 <a> texte utile des fois </a> Texte inutile 1234 <a> texte utile des fois </a> Texte inutile 1234 <a> texte utile des fois </a>

    La longueur du champ est bien entendu variable, le nombre d'enchainements est aussi variable et on cherche à récupérer tous les chiffres et une partie du texte utile des fois…

    Il va falloir trouver une encore autre solution…

    Encore un grand merci.

    Edit : Ça marche du tonnerre. J'ai testé avec 4 pages web différentes (mais formatées à peu près pareil en termes de présentation et je n'ai eu qu'à changer le texte de fin d'entête (PrmTxtDebut) et celui de pied de page (PrmTxtFin). Tout arrive parfaitement séparé et le reste peut être extrait avec des Left, Right, Mid, etc...
    Encore merci.

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

Discussions similaires

  1. [Python 2.X] Récupération d'une chaine de caractères dans une page web/HTML
    Par Julien33400 dans le forum Général Python
    Réponses: 2
    Dernier message: 30/10/2014, 09h38
  2. Sélectionner une date dans une Page d'inscription d'une page web
    Par Zizoua dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/07/2014, 16h14
  3. Encapsuler une page index.php dans une page index.html
    Par gorderson dans le forum Débuter
    Réponses: 1
    Dernier message: 04/10/2013, 21h07
  4. Réponses: 6
    Dernier message: 29/01/2006, 01h21
  5. inserer une page php externe dans une page JSP
    Par vrossi59 dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/07/2005, 16h25

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