La fonction "htmlcodepage" retourne -1 sur certains sites web

Bonsoir,

Effectivement il ne faudrait pas qu'on s'attire les foudres d'une entreprise pour mes seuls besoins personnels même s'ils seraient restreints à mon PC.

Savez-vous comment les developpeurs de LeDenicheur ou Autres récupèrent les liens de chaque produits ? Je suppose qu'ils ne les récupèrent pas à la main pour chacun non ?

Patrick, pourquoi me déconseilles-tu d'utiliser Regex ? et pourrais-tu un peu m'expliquer ceci dans ton code s'il te plait ? :

If Len(elem.innertext) > 30 And elem.innertext Like "*€" Then MsgBox elem.innertext

Est-ce que c'est "Si un intervalle de texte contient plus de 30 caractères et contenant à la fin le signe Euro. alors le montrer en msgbox."

En quoi cela nous retourne la description + prix + magasin ?

Merci et bonne soirée à tous les deux

Bonjour kevin

Savez-vous comment les developpeurs de LeDenicheur ou Autres récupèrent les liens de chaque produits ? Je suppose qu'ils ne les récupèrent pas à la main pour chacun non ?

ils ont des contrat avec les partenaires et il ont des renifleurs

Patrick, pourquoi me déconseilles-tu d'utiliser Regex ? et pourrais-tu un peu m'expliquer ceci dans ton code s'il te plait ? :

par ce que le texte html change tout le temps (même si toi tu vois les choses pareil a l’écran sur ta page )
Tandis que quand tu travaille avec les nodes en html tu ne peux pas te tromper tu peux explorer dans tout les sens
Et ici en l’occurrence dans un document HTML virtuel l'object( DomDocument en late binding le htmlfile)

Est-ce que c'est "Si un intervalle de texte contient plus de 30 caractères et contenant à la fin le signe Euro. alors le montrer en msgbox."
En quoi cela nous retourne la description + prix + magasin ?

pour que tu comprennent voici le code html de l'article du lien que tu m'a donné et ca je le dis bien c'est juste l'article

juste cette partie la

image
<div class="StyledContent-sc-16x82tr-4 xyuIH"><div data-test="ProductTitle" class="StyledDesktopTitle-sc-16x82tr-13 bYByns"><h1 class="Text--1acwy6y ePcLaf h2text StyledTitle-sc-16x82tr-2 iOBzCN" title="">Crucial P3 Plus M.2 2280 4To</h1></div><div class="StyledMore-sc-16x82tr-3 gKQkkm"><div class="StyledRatingWrapper-sc-16x82tr-8 ggbVQV"><a aria-label="Avis" href="/product.php?p=7280301#reviews"><div class="StyledWriteReview-sc-16x82tr-7 eAVWZD"><div style="width:17px;line-height:0"><img style="width:16px;height:16px;margin-right:1px" src="https://pricespy-75b8.kxcdn.com/g/rfe/icons/stars/empty-new.svg" alt="Empty Star 1"></div>Rédiger un avis</div></a></div><div class="PropertyList-sc-18ezrsm-0 ckuWpG StyledDisplayProperties-sc-16x82tr-9 cgxtxl">Prix/Go: 0.06 €/Go, Taille: 4000 Go, Facteur de forme: Carte M.2</div></div><div class="FiltersWrapper-sc-3hw98k-0 OmFjI hideInViewports-sc-1dph8no-0 bLnVSg"></div><div class="FiltersWrapper-sc-3hw98k-0 OmFjI hideInViewports-sc-1dph8no-0 cwPEAO"></div><div class="OurChoiceWrapper-sc-la83ah-0 dllOFW"><div class="TitleRow-sc-la83ah-1 eUHqSx"><span class="Text--1acwy6y esWSAW titlesmalltext" title="">leDénicheur recommande</span><button title="En savoir plus" aria-label="En savoir plus" aria-haspopup="dialog" type="button" class="Clickable Clickable--has-activation-effect"><div class="StyledIconWrapper-sc-la83ah-2 fmXuZW"><svg viewBox="0 0 24 24" size="16" class="StyledIcon--16bv7ev gZQawJ iconinfooutlined"><path color="base600" d="M11.0144 8.99519V6.97596H12.9856V8.99519H11.0144ZM12 20.0288C13.4423 20.0288 14.7885 19.6603 16.0385 18.9231C17.2564 18.2179 18.2179 17.2564 18.9231 16.0385C19.6603 14.7885 20.0288 13.4423 20.0288 12C20.0288 10.5577 19.6603 9.21154 18.9231 7.96154C18.2179 6.74358 17.2564 5.78205 16.0385 5.07692C14.7885 4.33974 13.4423 3.97115 12 3.97115C10.5577 3.97115 9.21154 4.33974 7.96154 5.07692C6.74358 5.78205 5.78205 6.74358 5.07692 7.96154C4.33974 9.21154 3.97115 10.5577 3.97115 12C3.97115 13.4423 4.33974 14.7885 5.07692 16.0385C5.78205 17.2564 6.74358 18.2179 7.96154 18.9231C9.21154 19.6603 10.5577 20.0288 12 20.0288ZM12 2C13.8269 2 15.5176 2.45673 17.0721 3.37019C18.5785 4.23558 19.7644 5.42147 20.6298 6.92788C21.5433 8.48238 22 10.1731 22 12C22 13.8269 21.5433 15.5176 20.6298 17.0721C19.7644 18.5785 18.5785 19.7644 17.0721 20.6298C15.5176 21.5433 13.8269 22 12 22C10.1731 22 8.48238 21.5433 6.92788 20.6298C5.42147 19.7484 4.23558 18.5545 3.37019 17.0481C2.45673 15.4936 2 13.8109 2 12C2 10.1891 2.45673 8.50642 3.37019 6.95192C4.25161 5.44551 5.44551 4.25161 6.95192 3.37019C8.50642 2.45673 10.1891 2 12 2ZM11.0144 17.024V11.0144H12.9856V17.024H11.0144Z" class="StyledIconPath--1sfb4ty cbLFbb"></path></svg></div></button></div><div class="Card--1okm4lr kyYNfx StyledCard-sc-1l5mtc9-1 dIGMsd StyledOurChoicePriceRow-sc-njk8f6-0 bBXYox"><div class="Row-sc-1l5mtc9-2 gROJAW pj-ui-price-row" data-test="PriceRow"><a href="https://ledenicheur.fr/go-to-shop/18708/offer/B0CCNCW5QX?client_id=1331" class="ExternalLink-sc-1ap2oa8-2 gdZFlq CardActionArea--1k4s5hl bYlBio StyledFeaturedRow-sc-1v7pabx-0 gmPPka" rel="nofollow noopener" target="_blank" aria-label="Crucial P3 Plus 4To M.2 PCIe Gen4 NVMe SSD interne - Jusqu’à 4800Mo/s "><div class="StyledFlexHorizontal-sc-1v7pabx-8 ldsRGo"><div class="StyledFlexVertical-sc-1v7pabx-9 StyledMiddleColumnMobilePadding-sc-1v7pabx-11 dmfyig cTlnY"><div class="StyledFlexVertical-sc-1v7pabx-9 dmfyig"><div class="StyledFlexHorizontal-sc-1v7pabx-8 ldsRGo"><div class="StoreInfo-sc-bc2k22-0 bxnFGm"><span class="StoreInfoTitle-sc-bc2k22-1 idSYNT">Amazon.fr</span><div class="StoreLogo-sc-hhn521-0 gxupyh"><picture alt="Amazon.fr"><source srcset="https://pricespy-75b8.kxcdn.com/g/ftg_logos/sizes/176/8/18708.png" type="image/png"><img src="https://pricespy-75b8.kxcdn.com/g/ftg_logos/sizes/176/8/18708.png" alt="Amazon.fr" width="176"></picture></div><div class="InfoGroup-sc-bc2k22-2 ciAlQW"></div></div><div class="StyledFlexVertical-sc-1v7pabx-9 StyledMiddleColumnDesktopPadding-sc-1v7pabx-12 dmfyig hNxAgZ"><div class="StyledFlexHorizontal-sc-1v7pabx-8 ldsRGo"><div class="StyledProductNameWrapper-sc-1v7pabx-1 fHmOTg"></div><div class="StyledFlexVertical-sc-1v7pabx-9 dmfyig"><div class="StyledFlexVertical-sc-1v7pabx-9 StyledBadgeWrapper-sc-1v7pabx-10 dmfyig iMjgya"></div><div class="Column-sc-6fgy6m-0 jgaCAU"><div class="Row-sc-6fgy6m-1 FirstRow-sc-6fgy6m-3 kvNmiL dmEZdp"><div class="Wrapper-sc-k40pbc-2 imAJaV"><div class="StyledBadges-sc-k40pbc-5 eciUQv"></div><div class="PriceAndShipping-sc-k40pbc-3 kLWxcT"><h4 class="Text--1acwy6y hpwkes bodysmalltext PriceLabel-sc-lboeq9-0 epoSmt StyledPriceLabel-sc-k40pbc-0 lioStU" title="" data-test="PriceLabel">219,99 €</h4></div></div></div><div class="Row-sc-6fgy6m-1 kvNmiL"><div class="PriceInfoElement-sc-6fgy6m-4 StockStatusWrapper-sc-6fgy6m-5 fYWTAg dokKkz"><div class="TooltipWrapper--52yny3 fHkOJz Tooltip-sc-1q3c5v9-3 MzdP" width="auto"><div class="IconAndText-sc-1q3c5v9-1 cmmIqo"><svg viewBox="0 0 24 24" size="24" class="StyledIcon--16bv7ev AEMqB iconstockinstock"><path color="positive500" d="M5 9H8V12H5V9Z M6 13H3V16H6V13Z M10 13H7V16H10V13Z M20.928 10.0929C20.5374 9.70236 19.9043 9.70236 19.5138 10.0929L15.9782 13.6284L14.2071 11.8574C13.8166 11.4668 13.1834 11.4668 12.7929 11.8574C12.4024 12.2479 12.4024 12.8811 12.7929 13.2716L15.2711 15.7497C15.3195 15.7981 15.372 15.8408 15.4276 15.8775C15.8159 16.1339 16.3436 16.0915 16.6857 15.7494L20.928 11.5071C21.3185 11.1166 21.3185 10.4834 20.928 10.0929Z" class="StyledIconPath--1sfb4ty wvcdN"></path></svg></div></div></div></div></div></div></div></div></div></div></div><div class="StyledEndColumn-sc-1v7pabx-5 jeCpcv"><div data-test="GoToStoreButton" class="StyledWrapper-sc-ltbgnx-0 jlMLdM"><button aria-label="Voir l’offre" class="BaseButton--onihrq fVjXiH primarybutton StyledButton-sc-ltbgnx-1 ddCaIx" type="button"><span class="StyledIcon--m5y9mm kLzyoK"><svg viewBox="0 0 24 24" size="20" class="StyledIcon--16bv7ev jAUDMZ iconchevronright"><path color="base700" d="M11.1456 7L16 12L11.1456 17L10 15.82L13.7282 12L10 8.18L11.1456 7Z" class="StyledIconPath--1sfb4ty hgoMSt"></path></svg></span></button></div></div></div></a></div></div></div></div>

comme tu peux le voir il y a plusieurs noeuds imbriqués

sais tu faire la différence entre (innertext et innerhtml et outerhtml)

oui/non?

1° innertext= texte sans balise (texte brut sans format)
2° innerhtml = code a l’intérieur d'une balise html
3° outertext=texte de paramètrage et propriété d'une balise html (ne fonctione plus tès bien depuis le html5 en tout cas pas comme il le devrait)
4° outerhtml=code html complet de la balise

donc si tu prends le innertext de l'un ou de l'autre noeuds imbriqués tu aura plus ou moins de données

et donc dans ma boucle node je prend celui qui dépasse les 30 caractères dans le innertext
je suis plus sur de récupérer les informations complètes

exemple
un code html et là je te l'indente pour que tu puisse visualiser les noeuds

<html>
<body>
<font class=azertyiopdgr>
     <font class=taratata color=black>
        <b>Produit: </b>
        <font class produit_bidulekezacoca color=red >barrete kingston</font>
     </font>
     <br/>
     <font class=power_egv_xyz color=black>
        <b>puissance: </b>
        8 giga
     </font>
    <br/>
    <font class=nb_pinturlututuchapeaupointu>
       <b> Nombre de pin: </b>
       220 pins
    </font>
    <br/>
      <font id=prixer class price_taratacestpastropcher>
          <b>PRIX: </b>
          <font class=classvisualpriceredblablabla color=red>
              <i>225,45</i> 
             <font class cycletrycmachinchose color=black>
               <b>€</b>
             </font>
          </font>
    </font>
</font>
</body>
</html>

ce qui donne ça sur une page web

image

le premier noeud .innertext dans une boucle sur Document.All donnera la totale du texte sans formatage

voilà le cours s'arrête là pour aujourd'hui et c'est déjà bien assez

Bonjour, merci beaucoup pour ces explications Patrick, je comprends un peu mieux le fonctionnement.

Je pense qu'il me faudrait apprendre le langage... C'est le HTML ou JavaScript je ne connais pas trop ?

J'ai bien rigolé sur les noms de variables "pinturlututuchapeaupointu" haha 😂.

je suis entrain d'essayer de comprendre comment tout ça fonctionne en modifiant l'exemple que tu m'as transmis. ça pourra surement m'aider a comprendre le fonctionnement général !

Aussi pour ta réponse au Regextract. Effectivement le code change et je le ressens puisque de temps en temps quand il y a des promos notamment sur TopAchat, le prix affiché n'est pas la bon.

De même sur mon code avec le Regextract pour LDLC, il ne fonctionne plus de tout depuis quelques semaines...

et puis je code un peu bourrin. c'est pas le plus optimisé qui soit....

exemple (sur TopAchat) pour récupérer l'endurance d'un SSD, ca se passe très bien et c'est rapide :

    ' ENDURANCE To -----------------------------------------------------
            htmldelapagetaille = regexExtract(htmlDeLaPage, "\d+ TBW") 'Endurance</div> <div class="caracDesc">100 TBW
            htmldelapagetaille = regexExtract(htmldelapagetaille, "\d+")
         ' Stocker la taille
            Cells(NumLigneLienActuel, numColEnduranceTo).Value = htmldelapagetaille

le type PCIE d'un SSD, c'est deja plus long :

    ' PCIE --------------
            htmldelapagetaille = regexExtract(htmlDeLaPage, "PCI-E \d\.0 \dx") '"caracDesc">NVMe (PCI-E 3.0 4x)
            htmldelapagetaille = htmldelapagetaille
            PCIEVersion = regexExtract(htmldelapagetaille, "PCI-E \d")
            PCIEVersion = regexExtract(PCIEVersion, "\d")
            PCIEVersion = "PCIE " + PCIEVersion
            PCIELigne = regexExtract(htmldelapagetaille, "\dx")
            'PCIELigne = regexExtract(PCIELigne, "\d")
         ' Stocker la taille
            Cells(NumLigneLienActuel, numColPCIEVersion).Value = PCIEVersion
            Cells(NumLigneLienActuel, numColPCIELigne).Value = PCIELigne

pour la lecture et ecriture d'un SSD, il y a plusieurs manière d'écrire la meme chose et c'est très galère ... :

    ' LECTURE ECRITURE ---------------------------------------------------------
            If regexExtract(htmlDeLaPage, "lecture<br></div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s") <> "" Then
                Lecture = regexExtract(htmlDeLaPage, "lecture<br></div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s")
                Lecture = regexExtract(Lecture, "[0-9-\s]* M")
                Lecture = regexExtract(Lecture, "[0-9-\s]*")
                Ecriture = regexExtract(htmlDeLaPage, "écriture</div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s")
                Ecriture = regexExtract(Ecriture, "[0-9-\s]* M")
                Ecriture = regexExtract(Ecriture, "[0-9-\s]*")

            ElseIf regexExtract(htmlDeLaPage, "lecture</div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s") <> "" Then
                Lecture = regexExtract(htmlDeLaPage, "lecture</div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s")
                Lecture = regexExtract(Lecture, "[0-9-\s]* M")
                Lecture = regexExtract(Lecture, "[0-9-\s]*")
                Ecriture = regexExtract(htmlDeLaPage, "écriture</div> <div class=caracDesc>Jusqu'à [0-9-\s]* Mo/s")
                Ecriture = regexExtract(Ecriture, "[0-9-\s]* M")
                Ecriture = regexExtract(Ecriture, "[0-9-\s]*")

            ElseIf regexExtract(htmlDeLaPage, "Vitesse Lecture / Ecriture<br></div> <div class=caracDesc>Jusqu'à \d+ Mo/s - \d+ Mo/s") <> "" Then
                htmldelapagetaille = regexExtract(htmlDeLaPage, "Vitesse Lecture / Ecriture<br></div> <div class=caracDesc>Jusqu'à \d+ Mo/s - \d+ Mo/s")
                htmldelapagetaille = regexExtract(htmldelapagetaille, "\d+ Mo/s - \d+ Mo/s")
                Lecture = regexExtract(htmldelapagetaille, "\d+ Mo/s")
                Lecture = regexExtract(Lecture, "\d+")
                Ecriture = regexExtract(htmldelapagetaille, "- \d+ Mo/s")
                Ecriture = regexExtract(Ecriture, "\d+")

            ElseIf regexExtract(htmlDeLaPage, "Vitesse Lecture / Ecriture séquentielle<br></div> <div class=caracDesc>Jusqu'à \d+ Mo/s - \d+ Mo/s") <> "" Then
                htmldelapagetaille = regexExtract(htmlDeLaPage, "Vitesse Lecture / Ecriture séquentielle<br></div> <div class=caracDesc>Jusqu'à \d+ Mo/s - \d+ Mo/s")
                htmldelapagetaille = regexExtract(htmldelapagetaille, "\d+ Mo/s - \d+ Mo/s")
                Lecture = regexExtract(htmldelapagetaille, "\d+ Mo/s")
                Lecture = regexExtract(Lecture, "\d+")
                Ecriture = regexExtract(htmldelapagetaille, "- \d+ Mo/s")
                Ecriture = regexExtract(Ecriture, "\d+")
            End If

            ' Stocker la taille
                Cells(NumLigneLienActuel, numColLecture).Value = Lecture
                Cells(NumLigneLienActuel, numColEcriture).Value = Ecriture
        

enfin pour le prix ca bouge de temps en temps mais ca reste très similaire :

If InStr(1, monlien, "ldlc") > 1 Then
                    htmlDeLaPagePrix = regexExtract(htmlDeLaPage, "'price':\s\d+.\d+")
ElseIf ...

Du coup c'est vrai que si je peux directement utiliser le HTML pour me simplifier tout mon code ca pourrait simplifier toutes mes opérations.

Merci et Bon dimanche

re

et bien sur

le regex c'est bien quand tu a des pages web statiques

mais quand tu a des pages web qui bougent plusieurs fois dans la journée comme ça il faut travailler en html dans ( UN DOM DOCUMENT)

un dom document c'est comme une page web mais en memoire

c'est l'object DOMDOCUMENT SI TU A COCHE LA LIBRAIRIE dans les références
SINON
C'EST htmlfile SI TU LE CREE EN DYNAMIQUE ET EN LATE BINDING

Sub test()
    Dim code, mondocumentHTML As Object
    code = Getcodehtmlblablabla("http://trucmuche de chez machinbidule.com/aticleG4561")
    If code <> "" Then
        Set mondocumentHTML = CreateObject("htmlfile")
        With mondocumentHTML
            .body.innerhtml = code
            'allez on part à la recherche
            'et pour cela tu peux utiliser tout les fonction dispo pour du html
            'exemple
            'on va lire tout les element qui ont la class "caradesc"
            Set meselement = .getelementsbyclassname("caracDesc")
            For Each elements In meselements
                MsgBox elements.innertext
            'on peut aussi a ce niveau aller chercher les childnodes de cet element
            'par exemple 3eme l'enfant 3 de chaque element  de class "caradesc" le premier commencant par 0
            MsgBox elements.ChildNodes(2).innertext
            Next
        End With
    End If
End Sub

Function Getcodehtmlblablabla(url)
'blablabla ta requete et par pitié mettez le header de la requête sinon vous finirez par être viré du site
'pour chopper le header d'une requete
'il vous suffit d'aller sur la page webavec votre navigateur
'une fois affiché
'vous tapez sur la touche "F12" et  dans la fenêtre qui s'ouvre  aller a "réseau"
'revenez sur la page web et vous rafraichissez la page
'dans la fenêtre f12 vous aurez l'entête de requete , l'entête de reponse
'et bien d'autres choses encore qui vous servirons
'voila voila
Set req = CreateObject("microsoft.xmlhttp")
    'blablabla LE HEADER !!!!!!!!!!!!!!!!!!!
    If req.Status <> 200 Then
        Getcodehtmlblablabla = ""
    Else
        Getcodehtmlblablabla = rep.responstetext
    End If
End Function

donne moi une liste de lien des deux sites j'essaie des trucs

Rechercher des sujets similaires à "fonction htmlcodepage retourne certains sites web"