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 :

Récupérer des données d'une page web entre 2 balises imbriquées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut Récupérer des données d'une page web entre 2 balises imbriquées
    Bonjour à tous,

    Dans ma quêtes de récupérer certaines données de sites web, je rencontre le code HTML suivant :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    			<ul class="coin-plie">
    				<li>
    										<h3 class="title"><a class="link" href="http://www.lien_1">Nom : XXXX</a><span> - Commune : Xxxxx</span></h3>
    										<p class="normal">APE : XXXXX - XXXXXXXXXXXXXX</p>
    				</li><li>
    										<h3 class="title"><a class="link" href="http://www.lien_2">Nom : YYYY</a><span> - Commune : Yyyyy</span></h3>
    										<p class="normal">APE : XXXXX - XXXXXXXXXXXXXX</p>
    				</li><li>
    										....
    				</li>			</ul>
    Je cherche à récupérer par VBA les différents liens à écrire dans la colonne A de ma feuille, les noms dans la colonne B, les communes dans la colonne C, et le code APE dans la colonne D.
    La difficulté est que je ne peux pas me baser uniquement sur la classe "link" ou la classe "title" car elles apparaissent également ailleurs dans le code HTML.
    Par contre, les balises où je cherche à récupérer les données sont toutes incluses dans la balise <ul class="coin-plie">
    Il faudrait donc que je puisse identifier tout d'abord la balise de classe "coin-plie", puis toutes les balises de classe "title".

    Comment puis-je faire ?
    Un grand merci par avance pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour
    puré tu trouve ca dans le tutoriel de qwazerty avec sa fonction getclassname
    ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each elem in IE.document.all
    if elem.classname="coin-plie"then mon_elem=elem:exit for
    next
    for each elem in mon_elem.all
    if instr(lcase(mon_elem.innerhtml),"href=")>0 then debug.print "balise " & elem.tagname & "  lien= " & elem.href
    next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Merci patricktoulon,

    En effet, après un long moment de recherche, j'étais tombé dessus. Je suis encore en train de le lire, il devrait y avoir d'autres points intéressants pour ma programmation.
    Ca cible bien ce que je recherche. Par contre tout n'est plus tout à fait à jour (ex : la page Google qui a évolué depuis, ou encore je n'arrive pas à afficher les caractéristiques des éléments sur IE ou Firefox), donc c'est plus long pour se familiariser avec tout ça.

    Je continue ma lecture et je crois les doigts pour réussir à finir mon programme VBA

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Bonjour,
    Après avoir passé pas mal de temps à décrypter le tuto de qwazerty, je rencontre encore une erreur.
    Je me suis en partie basée sur le code de patricktoulon, mais comme je rencontrais quelques erreurs, je l'ai modifié de la sorte :
    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
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "7112B"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IE As New InternetExplorer    ' Penser à activer les références « Microsoft Internet Controls » et « Microsoft HTML Object Library » (menu Outils -> Références dans VBA)
    Dim IEDoc As HTMLDocument
    Dim elem As HTMLUListElement
    Dim mon_elem As HTMLUListElement
    Dim URL As String
    Dim tabURL() As String
    Dim htmlTagCol As IHTMLElementCollection
    Dim HtmlElementStandard As HTMLGenericElement
     
    'Initialisation des variables
    URL = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher&aeadirectoryParam[page]=8"
     
    'Accès au site web
        IE.Navigate URL
        IE.Visible = True    'Affichage de la fenêtre IE
        WaitIE IE    'On attend le chargement complet de la page
        Set IEDoc = IE.document  'On pointe le membre Document (une variable spécifique pour cette élément permet de bénéficier de l'autocomplétion)
     
      'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
        For Each elem In IEDoc.all  'On liste les éléments de ce tableau
            If elem.className = "coin-plie" Then
                Set mon_elem = elem
                Exit For
            End If
        Next
     
        Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
        For i = 0 To 9   'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
            Set HtmlElementStandard = htmlTagCol(i)
            tabURL(i) = HtmlElementStandard.href
            MsgBox i & "-" & tabURL(i)
        Next
     
        MsgBox "Scan terminé"
     
    'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
    Sub WaitIE(IE As InternetExplorer)
       'On boucle tant que la page n'est pas totalement chargée
       Do Until IE.readyState = READYSTATE_COMPLETE 'Ou : IE.readyState = 4
          DoEvents
       Loop
    End Sub
    Problème : A la ligne #37 tabURL(i) = HtmlElementStandard.href, j'ai le message d'erreur
    L'indice n'appartient pas à la sélection.

    D'où vient le problème et qu'est-ce que je peux faire pour le supprimer ?

    Merci d'avance pour votre aide

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    c'est peut eztre normal tout les a n'on peut etre pas de href et puis le href est peut etre dans un enfant du a
    c'est pour cela que je n'ai pas été nominatif dans mon exemple
    d'autant plus que tu part du principe qu'il y a 9 a a chaque fois c'est peutre la encore pas le cas
    d'autant plaus que tu ne dimentionne pas taburl avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
       redim taburl(htmlTagCol .length,1)
     For i = 0 To htmlTagCol .length-1  'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
                tabURL(i) =htmlTagCol(i).href
            MsgBox i & "-" & tabURL(i).href
        Next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Par défaut
    Bonsoir patricktoulon,

    En effet, il peut y avoir moins de 10 entreprises par page (sur la dernière page en tout cas).
    Par contre, après contrôle de l'une des pages (celle sur laquelle j'effectue le code en cours), j'ai toujours href dans les balises a.

    J'ai modifié le code en suivant ton code :
    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
    Option Explicit
     
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "7112B"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IE As New InternetExplorer    ' Penser à activer les références « Microsoft Internet Controls » et « Microsoft HTML Object Library » (menu Outils -> Références dans VBA)
    Dim IEDoc As HTMLDocument
    Dim elem As HTMLUListElement
    Dim mon_elem As HTMLUListElement
    Dim URL As String
    Dim tabURL() As String
    Dim htmlTagCol As IHTMLElementCollection
    Dim HtmlElementStandard As HTMLGenericElement
    Dim i As Integer
     
    'Initialisation des variables
    URL = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher&aeadirectoryParam[page]=8"
     
    'Accès au site web
        IE.Navigate URL
        IE.Visible = True    'Affichage de la fenêtre IE
        WaitIE IE    'On attend le chargement complet de la page
        Set IEDoc = IE.document  'On pointe le membre Document (une variable spécifique pour cette élément permet de bénéficier de l'autocomplétion)
     
      'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
        For Each elem In IEDoc.all  'On liste les éléments de ce tableau
            If elem.className = "coin-plie" Then
                Set mon_elem = elem
                Exit For
            End If
        Next
     
        Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
        ReDim tabURL(htmlTagCol.Length, 1)
        For i = 0 To htmlTagCol.Length - 1 'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
            tabURL(i) = htmlTagCol(i).href
            MsgBox i & "-" & tabURL(i)
        Next
     
        MsgBox "Scan terminé"
     
    'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
    Sub WaitIE(IE As InternetExplorer)
       'On boucle tant que la page n'est pas totalement chargée
       Do Until IE.readyState = READYSTATE_COMPLETE 'Ou : IE.readyState = 4
          DoEvents
       Loop
    End Sub
    J'ai pour l'instant toujours la même erreur, sur la même ligne

Discussions similaires

  1. Récupérer des données d'une page web
    Par danyII dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2008, 11h31
  2. Envoyer des données POST à une page web puis récupérer l'URL
    Par Ze moi dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/04/2007, 17h18
  3. [RegEx] Récupérer des données dans une page Web
    Par Pragmateek dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2006, 19h44
  4. Récupérer des données sur une page HTML
    Par rupeni dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 18/11/2005, 17h22
  5. Récupérer des données dans une page HTML
    Par newdelirium dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2005, 19h18

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