RegexExtract -> récuperer une chaine de caractère de longueur variable

Bonsoir,

Aujourd'hui je m'expérimente au "Expression régulières" avec la fonction regexExtract.

Sub exemple()

    code = htmlCodePage("http://csgo.exchange/item/20928819706")
    code = regexextract(code, "<div class=""bar"">(\w+)")(0) & regexextract(code, "<div class=""bar"">\w+(\s+)")(0) & regexextract(code, "<div class=""bar"">\w+\s+(\W+)")(0) & regexextract(code, "<div class=""bar"">\w+\s+\W+(\s+)")(0) & regexextract(code, "<div class=""bar"">\w+\s+\W+\s+(\w+)")(0)
    MsgBox code

End Sub

Voici mon code. J'essaye de travailler sur cette ligne de ma page internet HTML: (ligne 119)

<div class="bar">AWP | Exoskeleton (Field-Tested)</div>

en orange l'information que je souhaite récupérer.

mon code permet d'obtenir: AWP | Exoskeleton c'est très bien, mais si la mise en forme de l'information que je recherche change comme cela exemple:

AWP | Exo skeleton

Mon code ne sortira que: AWP | Exo

Je début totalement avec les \w+ \s+ etc. Je n'arrive pas a comprendre comment récupérer toute ma chaine de caractère. l'idée serait de "detecter" </div> qui signifie que ma chaine de caractère est terminée.

par avance merci,

A+ dans le bus

Salut Gabin (dans le train),

Je propose d'essayer avec ce pattern :

"</?div( class=""bar"")?"

mais en utilisant regexreplace plutôt (tu remplaces par un " "). Ce sera peut-être plus simple.

Ensuite, tu trim le résultat (pour enlever les espaces aux extrémités) puis tu fais un regexreplace avec le pattern :

" {2,}"

en remplaçant par "~" par exemple (qui deviendra notre séparateur).

Tu splites le tout et tu obtiens ton tableau de valeurs.

A tester :

strClean = regexreplace(trim(regexreplace(code, "</?div( class=""bar"")?", "  ")), " {2,}", "~")
tdata = split(strClean, "~")
msgbox strClean
msgbox tdata(0)

A plus,

Salut 3GB

Wow, alors pour être honnête j'ai rien compris à tes lignes de code :)

Et ca ne marche po :/

La macro renvoie ce qui semble être l'intégralité du code HTML de ma page Web.

Je découvre complétement et tout est encore très flou pour le moment ! Je vais aller chercher des infos sur Split et regexreplace si cela peut m'aider

Non mais je suis c*n, j'ai pas pensé au fait que tu partais du code entier...

Donc je pense qu'il faut commencé par un regexextract en effet... Est-ce qu'il y a plusieurs lignes comme ça à récupérer (div class bar) ?

Je t'expliquerai en détail après si tu veux...

En fait, le truc, c'est que je n'ai pas ces fonctions regex (il s'agit d'addin je crois) et donc je ne sais pas si regeextract renvoie un tableau...

Voici un essai pour le principe :

Sub exemple()

code = htmlCodePage("http://csgo.exchange/item/20928819706")
tdiv = regexextract(code, "<div class=""bar"">.+</div>")
for i = lbound(tdiv) to ubound(tdiv)
    tdiv(i) = trim(regexreplace(tdiv(i), "</?div( class=""bar"")?", ""))
next i
strTotal = join(tdiv, "///")
msgbox strTotal
msgbox tdiv(0)

End Sub

Ici, seulement, je suppose que regexextract renvoie un tableau.

On extrait donc toutes les div bar avec regexextract. Pour chaque item du tableau obtenu, on remplace les parties <div> par une chaine vide. On supprime les espaces de début et de fin avec la fonction trim.

Notre tableau tdiv est alors censé contenir uniquement le texte entre les balises.

Salut, j'ai pas encore testé ton code mais oui regextract est un tableau. Je n'ai qu'une seule ligne a récupere, les autres informations que je souhaite sont d'autre lignes mais en répétant le code j'espere y arriver tout seul

Le code ne fonctionne pas incompatibilité de type.

A priori tu peux tester chez toi si tu veux le lien est sécurisé

Et du coup oui j'avais peut etre pas précisé mais la variable code contient l'intégralité de l'HTML du site.

for i = lbound(tdiv) to ubound(tdiv)

L'erreur vient de cette ligne puisque tdiv est un tableau ca doit coincer je ne comprend pas ce que tu essaye de faire dans la boucle i ?

Là, j'essaie de récupérer pour chaque ensemble de balises <div class="bar"></div>, le texte qui se trouve à l'intérieur. Il te faut seulement le premier c'est ça ?

Bah.. sauf erreur de ma part il n'existe qu'une seul récurence de <div class="bar"></div>

Oui je confirme je viens de vérifier

DU coup je viens de bricoler ca:

Sub exemple2()

code = htmlCodePage("http://csgo.exchange/item/20928819706")
tdiv = regexextract(code, "<div class=""bar"">.+</div>")
tdiv = Trim(regexreplace(tdiv, "</?div( class=""bar"")?", ""))
MsgBox tdiv

End Sub

mon résultat est: >AWP | Exoskeleton (Field-Tested)>

Donc presque parfait il faudrait enlever les > et >

Merci a toi, du coup je ne comprend pas mais il faut marquer tdiv au lieu de tdiv(0) pourtant je croyais que c'était un tableau

Ah oui, j'ai oublié la balise fermante :

Sub exemple2()

code = htmlCodePage("http://csgo.exchange/item/20928819706")
tdiv = regexextract(code, "<div class=""bar"">.+</div>")
tdiv = Trim(regexreplace(tdiv, "</?div( class=""bar"")?>", ""))
MsgBox tdiv

End Sub

Comme ça, ça devrait être mieux. De mon côté, je fais des essais mais je galère .

Edit : Ici tdiv est de type variant. Il est capable d'accueillir plusieurs valeurs mais s'il n'y a qu'une seule correspondance, alors il sera de type string.

Ecoute de mon coté le code est PARFAIT donc j'espere réussir a l'adapater sur mes autres éléments à rechercher.

Merci beaucoup!!

Je t'en prie Gabin !

Pour les explications :

"</?div( class=""bar"")?>"

Avec ce motif, on demande à remplacer toute chaine commenaçant par <, suivi éventuellement de /, suivi de div, suivi éventuellement de " class="bar"", enfin terminé par >.

C'est pas évident mais c'est passionnant les expressions régulières !

A bientôt,

Re tout le monde,

Re 3GB si tu lis ce post...

J'y arrive po

cette fois ci voici la ligne ou je veux extraire des infos:

<div class='statsInv'>Total = 1289.11</div>

Je veux juste extraire le prix: 1289.11

Voici le code qui me permet 'avoir le meilleur résultat:

Price = regexextract(code, "<div class='statsInv'>.+</div>")
Price = Trim(regexreplace(Price, "</?div( class='statsInv')?>", ""))
Price = Right(Price, Len(Price) - 8)
Price = Left(Price, Len(Price) - 4)

De temps en temps ca marche et des fois ca me renvoi cela:

34.7<div class='msgNotif' style='clear:both'>Tradable After Mar 07, 2021 (08:00:00)

Ou pire ca me renvoie des valeurs tronqué: 128 au lieu de 1289.11

merci d'avance

++

Salut Gabin !

Bah oui je le vois bien ton post .

C'est bizarre que ça te renvoie ça... Mais la fonction regexextract est une fonction personnalisée donc il se peut qu'elle prévoit des comportements qu'on ignore...

Y a-t-il plusieurs lignes cette fois-ci avec div statsInv ?

En tout cas, j'essaierais ça en premier lieu :

Price = regexextract(code, "<div class='statsInv'>.+</div>")
Price = regexextract(Price, "\d+(\.\d+)?")
"\d+(\.\d+)?"

signifie : au moins 1 chiffres \d+, éventuellement (grâce au ?) suivi de un point \. et au moins un chiffre \d+.

L'antislash sert à forcer la lecture des métacaractères comme un caractère normal. Mais as-tu vu ce lien :

https://www.sheets-pratique.com/fr/fonctions/regexmatch-2

Car, on y voit l'essentiel !

A plus,

CA MAAARCHE ! merci 3GB t'es un bon toi :D

Bonne soirée !!!

Merci, je suis tout content !

Garde quand même le lien au chaud le temps que tu te souviennes des métacaractères !

Très bonne soirée à toi aussi ! Et si tu as un souci de regex, n'hésite pas, j'aime beaucoup !

Rechercher des sujets similaires à "regexextract recuperer chaine caractere longueur variable"