Récupération en automatique sur le net

Nolem - 23 mars 2015 à 15:52
 nolem - 30 mars 2015 à 09:43
Bonjour,

Voici ma problèmatique, j'ai un fichier excel avec environ 2000 ligne et je dois chercher pour chaque ligne le numéro de téléphone.

je me demande si je peux ecrire une macro pour récupérer en automatique le numéro sur internet via les pages jaunes ou un autre site.

c'est peut etre un truc qui demande plus de savoir faire que ce que j'ai mais bon...

Merci de votre retour.

12 réponses

pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
Modifié par pijaku le 24/03/2015 à 08:01
Bonjour,

Pour répondre simplement à ta question, oui, il est possible par macro de récupérer automatiquement les numéros de téléphone de tes 2000 correspondants.

Cependant, je me dois de te prévenir que ce n'est pas le but de ce forum d'écrire le code à ta place.

Si tu as des bases en VBA cela ne devrait pas te poser de problème (des bases en html sont également requises, notamment dans la manière dont est structuré le code source d'une page html : les balises...)

Donc, sans en savoir davantage, je te recommande déjà cette lecture qui t'apportera tous les éléments indispensables à ton développement.
Reviens ici dans le cas ou tu "butterais" sur une partie de ton code ou, le cas échéant, pour nous apporter ta solution.
🎼 Cordialement,
Franck 🎶
0
Bonjour, merci pour cette réponse
j'ai consulté le tuto mais je n'arrive pas à faire ce que je veux

j'arrive à ouvrir une page web

mais je n'arrive pas cliquez sur un bouton précis

j'y ai passé la matinée.

comment je peux faire pour exposer mon sujet plus precisement?
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
24 mars 2015 à 14:12
Vous avez donc, à compter de maintenant, un début de code mais vous buttez sur un point précis.
Il vous faut donc, dans un premier temps, nous montrer ce que vous avez fait, à savoir :
  • copiez-collez le code tel qu'il est actuellement,
  • nous indiquer qu'elles ont été vos diverses tentatives infructueuses.


A partir de là, nous vous aiguillerons vers une solution envisageable.
0
Nolem > pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022

24 mars 2015 à 15:03
Bonjour

Oui en effet j ai un début de code et également des recherches sur les pages web concernés

Est ce que je peux vous envoyer un petit topo par mail

Avec des pièces jointe et des imprime écrans?

Cdt
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14 > Nolem
24 mars 2015 à 15:05
Est ce que je peux vous envoyer un petit topo par mail

Avec des pièces jointe et des imprime écrans?

Non. Tout se passe et doit se passer sur le forum.

Nous sommes, ici, sur un forum de développeur. Seul compte le code.

Comme, je le présume, il n'y a pas de secret dans ton(tes) code(s), merci de les placer ici avec tes explications concernant le problème que tu ne parviens pas à résoudre afin que l'on puisse continuer.
0
ok non pas de secret

mon objectif final est de récupérer des information sur la page

http://www.pagespro.com/recherche.php#results_part1_6480431

tel ca et effectif

pour cela je me connecte à la page

http://www.pagespro.com/

et je veux lancer une recherche sur le siret

je cherche donc a faire une action de clic sur l'onglet siret

mettre mon numéro de siret dans la zone de recherche et cliquer sur chercher

voici mon code

Sub testweb()
'
' testweb Macro
'definition des variables
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim InputGoogleZoneTexte As HTMLInputElement
Dim InputGoogleBouton As HTMLInputElement


    'Chargement d'une page Web societe.com
    IE.navigate "www.pagespro.com"
    'affichage de la page
    IE.Visible = True
    'On attend le chargement complet de la page
    WaitIE IE
   'On pointe le membre Document
   Set IEDoc = IE.document
   
   'On pointe notre bouton siren
   Set InputGoogleBouton = IEDoc.getElementById("siren")
   
    'On simule un clic
    InputGoogleBouton.Click
   
   'On pointe notre Zone de texte
   Set InputGoogleZoneTexte = IEDoc.all("siren_exp")
   
   'On définit le texte que l'on souhaite placer à l'intérieur siret
   InputGoogleZoneTexte.Value = "78002829600017"
    
    'On pointe notre bouton
    Set InputGoogleBouton = IEDoc.all("bouton_trouver_exp")
    
    'On simule un clic
    InputGoogleBouton.Click
    
    'On attend la fin de la recherche
    WaitIE IE



j'ai affiché le code htlm de la page et je trouve un Id "siren" lorsque je pointe sur le bouton avec la fleche.

cependant cela ne me selectione pas l'objet

Merci d'avance

ps 1: j'ai env 2000 numéro siret a checker et l'idée est de faire une boucle pour les récuperer en auto mais cela n'est pas le plus compliqué.

ps2 : je ne suis pas certain de la commande pour fermer IE à la fin de ma boucle.
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14 > Nolem
24 mars 2015 à 15:43
Malheureusement pour toi, le site que tu cherches à atteindre n'est pas adapté à Internet Explorer.
Que se passe t'il, avec Internet Explorer, lorsque tu fais cette manipulation "manuellement"?
1- ouvrir IE,
2- aller sur la page : www.pagespro.com
3- clic sur le bouton "siren"
Chez moi, rien ne change...
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
25 mars 2015 à 08:16
Bonjour,

Je vais tâcher de répondre à toutes tes questions. Ça risque de faire une longue réponse...

La ligne de commande :
15 waitIE IE fait reference à un autre module?

Non. Tu le saurais si tu avais lu, en détail, le tutoriel de Qwazerty.
Il s'agit d'une fonction de temporisation, code écrit par Qwazerty, qui permet d'attendre le chargement complet d'une page Internet.
Cette fonction est à placer dans le même Module que ta Sub. Son code est :
Sub WaitIE(IE As InternetExplorer)
'Boucle tant que la page n'est pas totalement chargée
'****************************************************
    Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
 
End Sub

Il en va de même pour la ligne 18 qui fait référence à la fonction WaitDoc, qui permet elle d'attendre le chargement complet du document html contenu dans ta page Internet.
Son code :
Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub


par contre si tu peux m'expliquer en deux mots ce que c'est cette histoire d'enfant... :)

Bien sur.
Tu as du constater, en parcourant le code source de ta page html, que les balises la composant sont imbriquées. Lorsque l'on indente correctement le code html c'est encore plus parlant.
Regarde cet exemple :
<div id="parent">
    <ul id="premierfils_de_div">
        <li id="petitfils_de_div" class="premierfils_de_ul">
            <a id="premierfilsdeli">Texte du lien 1</a>
        </li>
        <li id="petitfils_de_div" class="secondfils_de_ul">
            <a id="premierfilsdeli">Texte du lien 2</a>
        </li>
    </ul>
    <ul id="secondfilsdediv">
        <li id="petitfils_de_div" class="premierfils_de_ul">
            <a id="premierfilsdeli">Texte du lien 3</a>
            <a id="secondfilsdeli">Texte du lien 4</a>
            <a id="dernierfilsdeli">Texte du lien 5</a>
        </li>
    </ul>
</div>

Le code VBA est là dessus relativement clair :
Set Fiston = MyLi.FirstChild

FirstChild, comme son nom l'indique, est la première balise imbriquée dans la balise <li> référencée dans myLi.

est-il possible de rechercher une balise par class
d'après ce que j'ai compris c'est pas possible

Donc, tu as mal compris. Dans le tutoriel cité plusieurs fois dans cette discussion, tu as tout à ce sujet, ou presque.
Fonction : ICI
Exemple d'utilisation : ICI
Pour une bonne compréhension du code de cette fonction, l'essentiel est là :
For Each aElement In SourceElem
   If aElement.ClassName = aClassName Then

Signification de ces deux lignes :
  • On boucle sur tous les éléments aElement (variable de type IHTMLElement) de SourceElem (variable de type Collection (d'éléments HTML) : IHTMLElementCollection)
  • si l'élément en cours a pour classname le nom de class que l'on recherche alors...


sur ma page suivante je veux cliquez sur le lien plus dinfo sur l'entreprise
j'ai remarqué que dans le code HTML ci dessous qui correspond à mon objet de clique il y a le terme "plus d'infos sur l'entreprise" en noir,
je veux donc faire une recherche sur ce terme pour définir ma variable VBA

On a vu, jusqu'à maintenant, que l'on pouvait chercher un élément html par :
  • son id grâce à GetElementById
  • son attribut class grâce à la fonction getElementsByClassName

Sache également que l'on peut rechercher un élément grâce à :
  • son nom, en utilisant GetElementsByName
  • son type de balise, en utilisant GetElementsByTagName

Par contre, il faut entendre par élément, une balise html : <div>, <ul>, <input> etc...
Ici, tu cherches à faire une recherche sur le texte contenu dans une balise <a> (j'ai supprimé du code de cette balise l'événement onclick pour ne garder que l'essentiel) :
<a class="icon_infos" id="icon_infos_6480431">Plus d'infos sur l'entreprise</a> 

C'est possible, mais pas directement comme tu le fais.
Ce qu'il est possible de faire, avec cet élément :
  • une recherche par la class (className = "icon_infos"),
  • une recherche par l'id (id = "icon_infos_6480431")
  • une recherche par le type de balise :

Pour cela, regarde, en mode pas à pas, ce que fais ce code (ouvre au préalable la fenêtre exécution de VBE par Ctrl+G) :
Dim CollLiens As IHTMLElementCollection
Dim Liens As HTMLGenericElement
Set CollLiens = IEDoc.getElementsByTagName("a")
For Each Liens In CollLiens
    Debug.Print Liens.innerText & " -- " & Liens.innerHtml
Next


Pour conclure mon propos, et afin de t'aider à bien cibler un élément, je vais te donner une astuce plus simple, non-décrite dans le tuto de Qwazerty, qui répondra pleinement à ta toute preemière interrogation, à savoir :
j'arrive à ouvrir une page web
mais je n'arrive pas cliquez sur un bouton précis

A ce moment de la discussion, tu avais ciblé un élément de type input :
Dim InputGoogleBouton As HTMLInputElement
   'On pointe notre bouton siren
   Set InputGoogleBouton = IEDoc.getElementById("siren")

Pourquoi?
Simplement parce qu'en parcourant le code source à la recherche de "siren", tu es tombé sur une balise de type input ayant comme id "siren". Là ou tu t'es trompé c'est que cette balise ne sert pas à changer de page, il ne s'agissait pas du fameux bouton sur lequel tu voulais cliquer...
Ce bouton est référencé plus loin dans le code sous forme d'une balise "lien" :
<li id="siren">
    <a>monlien</a
</li>

[d'ou le fait qu'il te faille cliquer sur le premier_fils de la balise <li> d'id="siren"...]
Comment ai-je trouvé cet élément, cette balise.
Pour cibler un élément, utilise Firefox. Si tu ne l'as pas, télécharge le.
Sous firefox, un clic droit sur un élément de la page internet, te donne accès à l'ioption : "Examiner l'élément". Dans le bas de ta fenêtre apparait alors tout ce qui concerne le code source de l'élément ciblé : html, css...

0
Pijaku

merci pour cette réponse compléte.

j'ai lu le tuto. mais je débute et le mélange entre le VBA et le HTLM ne sont pas facile à assimiler.

je me suis tromper dans ma remarque c'etatit de la igne 18 dont je parlais.

j'ai bien identifié la boucle d'attente de la ligne 15 que j'ai mis dans un autre module pour y faire appel plusieur fois dans mon code sans le retaper à chaque fois et pour alleger mon code.

par contre pour la ligne 18 je n'avais pas identifié la boucle d'attente pour le chargement de la page.

bref

j'ai avancé de mon coté:

voici mon code qui me permet de récupérer dans un premier temsp le numéro de tel dans la variable le texteextrait.


Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim MyLi As HTMLLIElement
Dim Fiston As HTMLAnchorElement
Dim Info As HTMLAnchorElement
Dim Numtel As HTMLLIElement
Dim LeTexteExtrait As String


    'Chargement d'une page Web societe.com
    IE.navigate "www.pagespro.com"
    'affichage de la page
    IE.Visible = True
    'On attend le chargement complet de la page
    WaitIE IE
    'On pointe le membre Document
    Set IEDoc = IE.document
    
    'On pointe notre bouton siren
    Set MyLi = IEDoc.getElementById("siren")
    
    'On simule un clic
    Set Fiston = MyLi.FirstChild
    Fiston.Click
   
   'On pointe notre Zone de texte
   Set InputGoogleZoneTexte = IEDoc.all("siren_exp")
   
   'On définit le texte que l'on souhaite placer à l'intérieur siret
   InputGoogleZoneTexte.Value = "78002829600017"
    
    'On pointe notre bouton
    Set InputGoogleBouton = IEDoc.all("bouton_trouver_exp")
    
    'On simule un clic
    InputGoogleBouton.Click
    
    'On attend la fin de la recherche
    WaitIE IE
    
    'On pointe notre bouton plus d'info sur l'entreprise
    Set IEDoc = IE.document
    Set MyLi = IEDoc.getElementById("cleft")
    Set Info = MyLi.Children(6).Children(0).Children(1).Children(0).Children(3).Children(0).Children(1).Children(0)
    Info.Click
    
    'on charge la page actuelle
    Set IEDoc = IE.document
    Set Numtel = IEDoc.getElementById("non_free_num_ui").Children(1)
    LeTexteExtrait = Numtel.innerText 



je pense qu'il y a un moyen de le simplifier avec la fonction par classe

je travail dessus.


pour expliquer mes problématiques: je pense que l'id" icon_ifon_ 64... est un id qui change à chaque telechargement de la page

je ne peux donc pas taper dessus pour aller le chercher

j'ai vérifié en faisant F5.

je vais utiliser tes astuces.

merci beaucoup pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bon je suis perdu

j'ai tout essayé

je cherche a recupéré le chiffre d'affaire

la ligne de code Html est

<a class="achatRapport" href="/pages_pro/access.jsp?Siren=780028296&Nic=17" abp="57">2 086 K Euros</a>

et je cherche à recupérer les 2086 K

j'ai donc taper le code VBA

'On recherche l'élément le plus proche du tableau
Set GenericElem = IEDoc.getElementById("eco_emb_body_main_back")

'On recherche les éléments ayant "index" comme classe
'et qui se trouvent dans les enfants directs de GenericElem
htmlTabElement = getElementsByClassName(GenericElem, "achatRapport", False)


id eco_emb_body_main_back etant quelles que lignes plus haut.

mais mon tableau htmltabElement sort vide

je suis vraiment débutant et je me donne du mal.

j'ai egalement essayé en adrrese:

Set CA = IEDoc.getElementById("eco_emb_body_main_back").Children(0).Children(0).Children(1).Children(1).Children(2).Children(1)
CAtext = CA.innerText

mais il me donne une erreur objet

je peux le faire seulement avec le premeir children 0 mais du coup c'est pas la bonne ligne.

j'espère que je t'ai montrer que je bosse de mon coté pour comprendre.
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
25 mars 2015 à 13:27
1- lorsque tu places du code ici, mets le entre les balises code (<>) prévues à cet effet...

2- lorsque tu mets du code ici, mets le en entier. Il manque plein d'infos essentielles, du genre le type de variable déclarées...
0
le code vba en entier avec les deux options a suivre

je n'ai pas misle code de la function qui est identique au toto

Sub testweb()






Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim MyLi As HTMLLIElement
Dim Fiston As HTMLAnchorElement
Dim Info As HTMLAnchorElement
Dim Numtel As HTMLLIElement
Dim Numteltxt As String
Dim CA As HTMLGenericElement
Dim CAtext As String
Dim EF As HTMLLIElement
Dim EFtext As String
Dim EBE As HTMLLIElement
Dim EBEtext As String
Dim htmlTabElement() As IHTMLElement
Dim GenericElem As HTMLGenericElement


'Chargement d'une page Web societe.com
IE.navigate "www.pagespro.com"
'affichage de la page
IE.Visible = True
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document

'On pointe notre bouton siren
Set MyLi = IEDoc.getElementById("siren")

'On simule un clic
Set Fiston = MyLi.FirstChild
Fiston.Click

'On pointe notre Zone de texte
Set InputGoogleZoneTexte = IEDoc.all("siren_exp")

'On définit le texte que l'on souhaite placer à l'intérieur siret
InputGoogleZoneTexte.Value = "78002829600017"

'On pointe notre bouton
Set InputGoogleBouton = IEDoc.all("bouton_trouver_exp")

'On simule un clic
InputGoogleBouton.Click

'On attend la fin de la recherche
WaitIE IE

'On pointe notre bouton plus d'info sur l'entreprise
Set IEDoc = IE.document
Set MyLi = IEDoc.getElementById("cleft")
Set Info = MyLi.Children(6).Children(0).Children(1).Children(0).Children(3).Children(0).Children(1).Children(0)
Info.Click

'on charge la page actuelle
Set IEDoc = IE.document
'on recupère les données
Set Numtel = IEDoc.getElementById("non_free_num_ui").Children(1)
Numteltxt = Numtel.innerText


'On recherche l'élément le plus proche du tableau
Set GenericElem = IEDoc.getElementById("eco_emb_body_main_back")

'On recherche les éléments ayant "index" comme classe
'et qui se trouvent dans les enfants directs de GenericElem
htmlTabElement = getElementsByClassName(GenericElem, "achatRapport", False)




Set CA = IEDoc.getElementById("eco_emb_body_main_back").Children(0).Children(0).Children(1).Children(1).Children(2).Children(1)
CAtext = CA.innerText
Set EF = IEDoc.getElementById("notice_list").Children(0).Children(2).chidren(0).chidren(0).chidren(1)
EFtext = EF.innerText ' pas sur de l'adresse
Set EBE = IEDoc.getElementById("blocBas").Children(1).Children(3).chidren(1)
EBEtext = EBE.innerText


0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
25 mars 2015 à 14:27
Je vois plusieurs erreurs dans ton code, notamment au niveau des déclarations de variables.
Certaines sont oubliées, d'autres ne correspondent pas au type souhaité (approximation).
J'ai beau chercher, je ne trouve pas "cleft"...
Donc, j'ai mis un peu mes mains "dans le cambouis", mais comme je ne peux toujours pas tester...
Je t'ai ajouté des constantes. Le but ici est de mettre des noms plus parlant que les id d'un site Internet.
Je t'ai repéré, en commentaire, l'endroit à partir duquel ça devient vraiment hasardeux pour moi...
Je t'ai également ajouté la fonction WaitDoc...
J'ai donc modifié ton code comme suit :
Option Explicit

Const TXT_URL As String = "www.pagespro.com"
Const ID_LI_SIREN As String = "siren"
Const ID_INPUT_SIREN As String = "siren_exp"
Const ID_INPUT_BUTTON_TROUVER As String = "bouton_trouver_exp"
Const ID_LIEN_INFOS As String = "icon_infos_6480431"

Sub testweb()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim MyLi As HTMLLIElement
Dim LienSiren As HTMLAnchorElement
Dim InputSiren As HTMLInputElement
Dim InputBtnTrouver As HTMLInputButtonElement
Dim Info As HTMLAnchorElement
Dim htmlTabElement() As IHTMLElement
Dim GenericElem As IHTMLElement
Dim Elem As IHTMLElement

Dim Numtel As HTMLLIElement
Dim Numteltxt As String
Dim CA As HTMLGenericElement
Dim CAtext As String
Dim EF As HTMLLIElement
Dim EFtext As String
Dim EBE As HTMLLIElement
Dim EBEtext As String

    'Chargement d'une page Web societe.com
    IE.navigate TXT_URL
    'affichage de la page
    IE.Visible = True
    'On attend le chargement complet de la page
    WaitIE IE
    'On pointe le membre Document
    Set IEDoc = IE.document
    WaitDoc IEDoc
    
    'On pointe notre bouton siren
    Set MyLi = IEDoc.getElementById(ID_LI_SIREN)
    
    'On simule un clic
    Set LienSiren = MyLi.FirstChild
    LienSiren.Click
   
   'On pointe notre Zone de texte
   Set InputSiren = IEDoc.getElementById(ID_INPUT_SIREN)
   'On définit le texte que l'on souhaite placer à l'intérieur siret
   InputSiren.Value = "78002829600017"
    
    'On pointe notre bouton
    Set InputBtnTrouver = IEDoc.getElementById(ID_INPUT_BUTTON_TROUVER)
    'On simule un clic
    InputGoogleBouton.Click
    
    'On attend la fin de la recherche
    WaitIE IE
    
    'On pointe notre bouton plus d'info sur l'entreprise
    Set IEDoc = IE.document
    WaitDoc IEDoc
    
    Set Info = IEDoc.getElementById(ID_LIEN_INFOS)
    Info.Click
    
    'on charge la page actuelle
    Set IEDoc = IE.document
    WaitDoc IEDoc
    '****************************** A PARTIR D'ICI
    'on recupère les données
    Set Numtel = IEDoc.getElementById("non_free_num_ui").Children(1)
    Numteltxt = Numtel.innerText
    
  
   'On recherche l'élément le plus proche du tableau
   Set GenericElem = IEDoc.getElementById("blocBas")
   
   'On recherche les éléments ayant "index" comme classe
   'et qui se trouvent dans les enfants directs de GenericElem
   htmlTabElement = getElementsByClassName(GenericElem, "achatRapport", False)
   If Not htmlTabElement Is Nothing Then
      For Each Elem In htmlTabElement
        MsgBox Elem.innerText
      Next
   End If
   ' Set CA = IEDoc.getElementById("eco_emb_body_main_back").Children(0).Children(0).Children(1).Children(1).Children(2).Children(1)
   ' CAtext = CA.innerText
   ' Set EF = IEDoc.getElementById("notice_list").Children(0).Children(2).chidren(0).chidren(0).chidren(1)
   ' EFtext = EF.innerText ' pas sur de l'adresse
   ' Set EBE = IEDoc.getElementById("blocBas").Children(1).Children(3).chidren(1)
   ' EBEtext = EBE.innerText
    
End Sub

Sub WaitIE(IE As InternetExplorer)
    Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
End Sub

Sub WaitDoc(doc As HTMLDocument)
  Do While Not doc.readyState = "complete"
    DoEvents
  Loop
End Sub

Function getElementsByClassName(IEParentElement As IHTMLElement, aClassName As String, Optional JustChildren As Boolean = False) As IHTMLElement()
'Retourne un tableau contenant les éléments de la page ayant pour Class aClasseName
Dim aElement As IHTMLElement
Dim FuncElements() As IHTMLElement
Dim SourceElem As IHTMLElementCollection
Dim iElem As Integer
   
   'On prend en compte le lieu de recherche
   If JustChildren Then
       'Ici on ne tiendra compte que des enfants directs de IEParentElement
       Set SourceElem = IEParentElement.Children
   Else
       Set SourceElem = IEParentElement.all
   End If
   
   'On boucle sur tous les éléments contenus dans SourceElem
   For Each aElement In SourceElem
       'On vérifie si l'élément correspond à notre recherche
       If aElement.ClassName = aClassName Then
           'On redimensionne notre tableau
           'Cela semble inutile de regarder si FuncElements est un Array...
           'Mais sans cette ligne FuncElement n'est jamais reconnu comme tel...
           iElem = IIf(IsArray(FuncElements), UBound(FuncElements) + 1, -1)
           ReDim Preserve FuncElements(iElem)
           'Et on place l'élément trouvé à l'intérieur
           Set FuncElements(UBound(FuncElements)) = aElement
       End If
   Next
   'On place le tableau en retour de notre fonction
   getElementsByClassName = FuncElements
   'On libère l'espace mémoire occupé par notre tableau provisoire
   Erase FuncElements
End Function 

0
Merci pour le code nettoyer

je comprends que cela devient flou si tu ne peux pas tester

à partir de ta remarque ' A partir d'ici je cherche à récupérer des données dans le code HTML

j'y arrive pour la variable Numtel et Numteltext

j'ai bien le Numéro de tel dans ma variable

mon problème est que je n'arrive pas récupérer les autres infos:

CA
EBE
EFE

je n'arrive pas trouver une astuce pour me positionner sur la ligne de code HTML


<a class="achatRapport" href="/pages_pro/access.jsp?Siren=780028296&Nic=17" abp="57">2 086 K Euros</a>


qui contient mon information pour ca "2086 K euros"

j'ai essayé par deux moyen

1°)

faire une recherche par classename en reprenant la fonction du tuto de la ligne 70 à la lige 74

mais le tableau de sortie de la fonction est vide

2°)

en me "déplacent" par children la ligne 79.
le problème c'est qu'en mode pas à pas ça m'indique que une erreur 424 -->

j'ai essayer de faire fonctionner le code juste avec :

Set CA = IEDoc.getElementById("eco_emb_body_main_back")
CAtext = CA.innerText


je n'ai pas de beug

mais je ne suis pas sur ma bonne ligne.

j'en ai conclut que ma descente de fichier enfant n'etait pas bonne. ou que cette Id etait present plusieur fois dans ce code html.

j'ai cherché à mettre un espion sur CA dans la configuration ci dessus pour voir ce que je récuperais mais j'ai du mal a comprendre vu qu il y a un paquet de paramètre sur la variable

encore merci pour ton aide

ce truc est devenu un défi pour moi et ca m'obsède.
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
25 mars 2015 à 15:57
Si ta recherche consiste à trouver l'élément de balise <a> qui a pour classname "achatrapport", tu peux essayer de faire simple :


Dim maCollLiens As IHTMLElementCollection
Dim Lien As HTMLAnchorElement

'blabla, tout ton code ici
'Liste toutes les balises <a> du document
Set maCollLiens = IEDoc.getElementsByTagName("a")
'boucle sur toutes les balises <a>
For Each Lien In maCollLiens
    'si classname =  "achatrapport"
    If Lien.className =  "achatrapport" Then MsgBox "gagné : " & Lien.InnerText
Next
0
ok je viens de teste ta boucle

cela me donne 105 individus dans la collection

je les ai rapidement fait défiler en observant les paramètre dans la fenêtre des variables en pas à pas et aucun ne correspond à a ma ligne de code

comment cela est possible?
0
Suite

j'ai verifié si j'avais une ligne avec une classname en head

j'ai modifié le code comme suit:


Set maCollLiens = IEDoc.getElementsByTagName("div")
'boucle sur toutes les balises <div>
For Each Lien In maCollLiens
'si classname = "head"
If Lien.className = "head" Then MsgBox "gagné : " & Lien.innerText
Next


pour voir si ta boucle marchait

j'ai bien une MsgBox

ma question est la suivante:

est-il possible que ma ligne de code HTML ne soit pas prise en compte dans ta collection car c'est un enfant de qqchose?

si oui doit previcer un .all qqpart?

Cdt
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
26 mars 2015 à 07:42
Bonjour,

est-il possible que ma ligne de code HTML ne soit pas prise en compte dans ta collection car c'est un enfant de qqchose?
Si je me réfère à l'aide en ligne (et c'est ce que je fais tout le temps en cas de doute, ou pas...) : https://msdn.microsoft.com/en-us/library/ie/ms536439%28v=vs.85%29.aspx
la réponse est non :
When you use the getElementsByTagName method, all child and nested child elements with the specified tag name are returned.
C'est clair.
Mais, j'ai constaté que manipuler IE est quelque chose d'assez hasardeux. Il arrive qu'une page ait le statut "complete", mais qu'elle ne soit pas chargée totalement. Je n'aime pas trop cela car rien ne vaut l'exactitude, mais parfois, juste ajouter un simple Application.Wait (voir l'aide pour cette fonction et ses paramètres) avant la recherche peut aider...
Sinon, d'autres pistes, que, là encore, je ne peut pas tester :
Set maCollLiens = IEDoc..body.all.tags("a")

ou encore :
Set maCollLiens = IEDoc.body.getElementsByTagName("div")
0
je cherche je chercher

ma ligne de code htlm <a>

est sous une ligne <frame hors j'ai lu qu'il y avait une subtulité sur ce type de ligne.

cela peut-il venir de là?

Cdt
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
14
26 mars 2015 à 07:43
cela peut-il venir de là?
Peut être, je ne sais pas. Ou as tu lu cela?
0
Pijaku

Encore merci pour ton aide

devant mais problème sur ce site pour trouver mes ligne de code HTML j'ai chercher a travailler sur un autre site.

et tous nos echanges m'ont bien servi.

voilà mon code



Option Explicit

Const TXT_URL As String = "www.societe.com"
Const ID_CA As String = "presentationlien"
Const ID_TAB As String = "rensjur"
Const ID_INPUT_SIREN As String = "etablissement"
Const ID_INPUT_SIREN2 As String = "etab"
Const ID_INPUT_BUTTON_TROUVER As String = "buttsearch"
Const ID_LIEN_INFOS As String = "icon_infos_6480431"





Sub Web()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim MyLi As HTMLInputElement
Dim InputSiren As HTMLInputButtonElement
Dim InputBtnTrouver As HTMLInputButtonElement
Dim Stepsearch As IHTMLElement



Dim NAF As HTMLGenericElement
Dim NAFtext As String
Dim CA As HTMLGenericElement
Dim CAtext As String
Dim EF As HTMLLIElement
Dim EFtext As String
Dim i


For i = 2 To 2310

'Chargement d'une page Web societe.com
IE.navigate TXT_URL
'affichage de la page
IE.Visible = True
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc

'On pointe le champs de recherche
Set MyLi = IEDoc.all("champs")
'On définit le texte que l'on souhaite placer à l'intérieur siret
MyLi.Value = Sheets("produits a base de viande").Cells(i, 2).Value
'On pointe notre bouton
Set InputBtnTrouver = IEDoc.getElementById(ID_INPUT_BUTTON_TROUVER)
'On simule un clic
InputBtnTrouver.Click
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc

'on pointe le lien fiche entreprise
Set Stepsearch = IEDoc.getElementById(ID_INPUT_SIREN)
Set InputSiren = Stepsearch.Children(4).Children(0)


'On simule un clic
InputSiren.Click




'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc


'on recupère les données

'CA
Set CA = IEDoc.getElementById(ID_CA).Children(0)
CAtext = CA.innerText

'EF
Set EF = IEDoc.getElementById(ID_TAB).Children(0).Children(10).Children(1)
EFtext = EF.innerText

'NAF
Set NAF = IEDoc.getElementById(ID_TAB).Children(0).Children(6).Children(1)
NAFtext = NAF.innerText




Sheets("produits a base de viande").Cells(i, 8) = CA.innerText
Sheets("produits a base de viande").Cells(i, 9) = EF.innerText
Sheets("produits a base de viande").Cells(i, 10) = NAF.innerText


Next i



il marche merci

cependant en déroulant ma boucle je me suit apperçu d'un problème en fonction du numéro de siret que je place dans ma barre de recherche.

ligne 'on definit le texte ...

la page qui se charge derièrre n'a pas la même structure et plus particulièrement il y a un icone qui disparait.

ce qui à pour conséquence de me faire planter ma ligne de code:
'on pointe la ligne entreprise
puisque la definition des enfants n'est plus la bonne.

voici le code HTML lorsque ca marche



<div class="monocadre" id="etablissement" abp="362">
<h3 abp="363">L'établissement</h3>


<table id="etab" cellspacing="0" cellpadding="0" abp="364">



<p class="buttbluer" abp="432"></p>

<div class="clearboth" abp="434"></div>

<p class="buttbluer" abp="435"><a onclick="ga('send', 'event', 'Fiche_entreprise', 'Onglet-etablissement', 'voir_la_fiche_entreprise');" href="/societe/a-la-source-780028296.html" abp="436">Voir la fiche de l'entreprise</a></p>



</div>



et moi je clique sur la ligne <a onclick="ga('send', 'event', 'Fiche_entreprise', 'Onglet-etablissement', 'voir_la_fiche_entreprise');" href="/societe/a-la-source-780028296.html" abp="436">Voir la fiche de l'entreprise</a></p>


Voila le code quand ca ne marche pas


<div class="monocadre" id="etablissement" abp="362">
<h3 abp="363">L'établissement</h3>




<table id="etab" cellspacing="0" cellpadding="0" abp="364">



<div class="clearboth" abp="432"></div>

<p class="buttbluer" abp="433"><a onclick="ga('send', 'event', 'Fiche_entreprise', 'Onglet-etablissement', 'voir_la_fiche_entreprise');" href="/societe/abattoir-et-decoupes-des-tuileries-507518298.html" abp="434">Voir la fiche de l'entreprise</a></p>



</div>


et je veux toujours cilquer sur la ligne

<a onclick="ga('send', 'event', 'Fiche_entreprise', 'Onglet-etablissement', 'voir_la_fiche_entreprise');" href="/societe/abattoir-et-decoupes-des-tuileries-507518298.html" abp="434">Voir la fiche de l'entreprise</a></p>

je cherche donc une atsuce pour lui dire:

quant il y a trois lignes va sur la troisième et quand il y a 4 lignes va sur la 4

Merci de ton aide.
0
bonjour

ne cherche pas j'ai trouvé

tu vas encore dire que je n'avais pas lu le tuto en entier donc j'ai relu et trouver

htmlTabResultat.Children.Length

j'avance...
0
Pijaku

encore merci

j'ai réussit a faire ce que je voulais

je mets mon code ca peut aider qq1



Option Explicit

Const TXT_URL As String = "www.societe.com"
Const ID_CA As String = "presentationlien"
Const ID_TAB As String = "rensjur"
Const ID_INPUT_SIREN As String = "etablissement"
Const ID_INPUT_BUTTON_TROUVER As String = "buttsearch"






Sub Web()
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim MyLi As HTMLInputElement
Dim InputSiren As HTMLInputButtonElement
Dim InputBtnTrouver As HTMLInputButtonElement
Dim Stepsearch As IHTMLElement




Dim CA As HTMLGenericElement
Dim CAtext As String
Dim i
Dim j


Dim htmlTabResultat As HTMLGenericElement
Dim htmlLigneResultat As HTMLGenericElement



For i = 2 To 2310

'Chargement d'une page Web societe.com
IE.navigate TXT_URL
'affichage de la page
IE.Visible = True
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc

'On pointe le champs de recherche
Set MyLi = IEDoc.all("champs")
'On définit le texte que l'on souhaite placer à l'intérieur siret
MyLi.Value = Sheets("produits a base de viande").Cells(i, 2).Value
'On pointe notre bouton
Set InputBtnTrouver = IEDoc.getElementById(ID_INPUT_BUTTON_TROUVER)
'On simule un clic
InputBtnTrouver.Click
'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc

'on pointe le lien fiche entreprise

Set Stepsearch = IEDoc.getElementById(ID_INPUT_SIREN)
On Error GoTo LineSAUT
If Stepsearch.Children.Length = 5 Then
Set InputSiren = Stepsearch.Children(4).Children(0)
ElseIf Stepsearch.Children.Length = 4 Then
Set InputSiren = Stepsearch.Children(3).Children(0)
End If


'On simule un clic
InputSiren.Click




'On attend le chargement complet de la page
WaitIE IE
'On pointe le membre Document
Set IEDoc = IE.document
WaitDoc IEDoc


'on recupère les données
Set htmlTabResultat = IEDoc.getElementById(ID_TAB).Children(0)
j = 8
For Each htmlLigneResultat In htmlTabResultat.Children

Sheets("produits a base de viande").Cells(i, j) = htmlLigneResultat.Children(0).innerText

Sheets("produits a base de viande").Cells(i, j + 1) = htmlLigneResultat.Children(1).innerText

j = j + 2

Next




'CA
Set CA = IEDoc.getElementById(ID_CA).Children(0)
CAtext = CA.innerText






Sheets("produits a base de viande").Cells(i, j) = CA.innerText

LineSAUT:

Next i




End Sub

Sub WaitIE(IE As InternetExplorer)
Do Until IE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub

Sub WaitDoc(doc As HTMLDocument)
Do While Not doc.readyState = "complete"
DoEvents
Loop
End Sub


j'ai juste un petit pbl en ligne 65

je mets un on error goto pur gérer le cas ou la recherche internet ne donne aucun résultat

cette ligne marche en pas à pas détaillé mais pas en exécution normale.

si qq'un veut m'expliquer je veux bien
0