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 éléments dans une page internet


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Récupérer des éléments dans une page internet
    Bonjour,

    Grâce au très bon tuto de @qwazerty (https://qwazerty.developpez.com/tutoriels/vba/ie-et-vba-excel/), j'ai réussi à récupérer pas mal d'informations qui m'intéressait dans la page Internet de mon thermostat Nest (https://home.nest.com/xxxxx).

    Notamment grâce à la "class" de la source comme:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Capture temp cible
       Set HtmlElementStandard = IEDoc.getElementsByClassName("styles--low_L-b styles--active_22w").Item
       Temp_cible = HtmlElementStandard.innerText
     
    'Capture temp actuelle
        Set HtmlElementStandard = IEDoc.getElementsByClassName("styles--backgroundText_9E_").Item
        Temp_Int = HtmlElementStandard.innerText


    Malheureusement, je bloque sur quelques éléments. j'aimerai récupérer le nombre d'éléments (ou Line) dans <g class= “styles--ticks_3il”> ou la valeur de <path class= “ styles--currentTemperatureTick_UEn”>



    Et en utilisant la technique de "IEDoc.getElementsByClassName", je n'y arrive pas.

    D'avance merci pour vos suggestions
    A+

  2. #2
    Membre à l'essai
    Bonjour,

    Pas moyen de trouver une solution par moi-même. Je charge bien l’objet mais il ne contient pas les données recherchées. Il y a sûrement une subtilité mais pour l’instant, je ne vois pas. Si quelqu’un a des pistes !!

    Valeurs cherchées:


    Contenu de l'objet "styles--currentTemperatureTick_UEn" par exemple:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Set HtmlElementStandard = IEDoc.getElementsByClassName("styles--currentTemperatureTick_UEn").Item
       Val_cherchée = HtmlElementStandard.innerText


    Malheureusement, l'espion sur HtmlElementStandard ne me remonte rien d'intéressant !!



    Merci d'avance

  3. #3
    Expert éminent
    Salut

    Il est préférable de déclarer la variable dans son type natif pour avoir le plus de chance possible d'avoir accès à l'ensemble des méthodes et propriétés qui lui sont liées.
    Ainsi, essaie de déclarer ta variable comme étant de type SVGPathElement (j'ai vérifié elle est présente dan Escel, y compris dans l'explorateur d'objets (Touche F2)

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre à l'essai
    Merci Qwazerty.

    Les premiers tests de cette méthode me donnent l'erreur 91 (https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/object-variable-not-set-error-91)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Dim Obj_SVGPathElement As SVGPathElement
     
    ....
     
    'On pointe le document
       Set IEDoc = IE.document
     
    'Capture Objet
        Obj_SVGPathElement = IEDoc.getElementsByClassName("styles--currentTemperatureTick_UEn")


    Je continue mes recherches sur cette piste

    PS: Pour reproduire les formes, il est possible utiliser ce site https://codepen.io/pen/?&editable=true (avec Chrome ou Edge) et le code
    Code XML :Sélectionner tout -Visualiser dans une fenêtre à part
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 460" width="100%" height="100%"><defs><clipPath id="button-separator"><rect x="110" y="370" width="118" height="110" /><rect x="232" y="370" width="166" height="110" /></clipPath></defs><path class="styles--targetTemperatureTick_BtG" d="M 168.319 78.4471 L 144.806 20.6727 L 153.245 17.4333 L 174.429 76.1017 L 168.319 78.4471 Z" /><path class="styles--currentTemperatureTick_UEn" d="M 188.023 63.4484 L 174.767 10.8531 L 183.575 8.81969 L 194.717 61.903 L 188.023 63.4484 Z" /></svg>

  5. #5
    Expert éminent
    Salut

    Je n'ai pas trop le temps de m'y intéresser mais changeons peut-être de cap.
    Si je comprends bien la structure du code Html, à chaque Path correspond un trait, donc le nombre de structure <Path> détermine le nombre de traits, donc la température. Pourquoi ne pas simplement déterminer la température en fonction du nombre de traits _ donc du nombre d'éléments dans child ou children (je confonds toujours les deux)_?

    Pour l'erreur de code, GetElementSbyClassName renvoi un tableau d'éléments, il faut donc en pointer 1, par défaut le 1er mais attention qu'il n'y en ait pas plusieurs sur la page portant le même nom...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Obj_SVGPathElement = IEDoc.getElementsByClassName("styles--currentTemperatureTick_UEn")(0)



    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre à l'essai
    Mince, j'avais écrit un long message et j'ai eu une erreur donc tout perdu

    Pour résumer, définir la variable en SVGPathElement ne me donne pas plus de détails qu'en HTMLGenericElement.

    Compter les traits (je trouvais les "line stroke-width" de mon 1er message dans All.Item donc je pourrais récupérer les valeurs en X et Y) mais j'ai remarqué des mêmes valeurs pour des températures différentes donc ne me semble pas très précis de la part de Nest.

    Nest s'est fermé au monde en supprimant les API récemment donc j'ai tenté une autre méthode mais j'ai l'impression que c'est un pansement sur une jambe de bois. Je crois qu'il est temps de tester le Netatmo !!!

  7. #7
    Expert éminent
    Salut

    Dans ton message #2, tu montres un bout de l'espion de la variable SVG, tu as regardé dans la section PathSegList?
    Pour ce que j'en ai vu dans le code source un trait = un <Path>.

    Pour le reste je ne connais pas cette technologie, ni les soft en ligne qui l'utilise donc je ne saurais pas en dire plus.

    Bon courage
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre à l'essai
    Voici ce qu'il y a dans PathSegList:

  9. #9
    Expert éminent
    Et le 6 correspond à quelque chose? Il est en corrélation avec le nombre de trait affichés à l'écran?

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  10. #10
    Membre à l'essai
    Je ne sais pas à quoi il correspond car il y a toujours 6 !

###raw>template_hook.ano_emploi###