[..] Regex - extraire un string entre deux string connus

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

[..] Regex - extraire un string entre deux string connus

#1

Message par JulienBoul »

Bonjour à tous,

Comme d'hab, je planche dessus depuis 2-3 heures, c'est terriblement vexant les expressions régulières...
Voici mon code:

Code : Tout sélectionner

#include <MsgBoxConstants.au3>

Example()

Func Example()
    ; Lit le fichier sans le télécharger dans un dossier. L'option de 'obtenir le fichier à partir du cache local' a été choisie.
    Local $dData = InetRead("https://urldusiteweb.html")
$Extraction = StringRegExp($dData, "(?im)^<span><small>(\N+) € HT</small></span>", 1)
MsgBox(0,0,$Extraction)
EndFunc   ;==> Example
Voici un extrait du mon code source du site web:

Code : Tout sélectionner

<span style="display:none"></span>
<br>
<span><small>10,71 € HT</small></span>
<meta itemprop="priceCurrency" content="EUR" />
Je souhaite extraire le string "10,71".
Pouvez vous m'aider?

Idem pour extraire "767" depuis l'ensemble de lignes

Code : Tout sélectionner

var id_lang = 1;
var id_product = 767;
var img_dir = 'https://url/';
D'avance merci !
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Regex - extraire un string entre deux string connus

#2

Message par parazitenew »

Bonjour,

Pour information le StringRegExp() retourne un tableau et non un String. Pour chercher un String entre deux autres tu peux utiliser _StringBetween() , et vérifies aussi que ton URL est bien lu, car je doute de l’efficacité de InetRead(), personnellement je préfère InetGet() l’enregistrer en .txt et travailler dessus, ensuite je supprime le fichier en question avec FileDelete(). Parfois ça ne marche pas, le code html lu ne correspond pas forcément à ce qui est affiché avec Firebug ou tout autre outil de développement.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Regex - extraire un string entre deux string connus  

#3

Message par jguinch »

Tu y étais presque. Comme l'a dit parazitenew, le résultat retourné est un tableau (car tu as utilisé l'option 1). Donc il suffit d'afficher $Extraction[0]

Pour la deuxième question :
$aRet = StringRegExp($string, "var id_product = (\d+)", 1)
MsgBox(0, "", $aRet[0])
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

Re: [..] Regex - extraire un string entre deux string connus

#4

Message par JulienBoul »

Hello,

Oui, merci, je suis sur plusieurs sujets en ce moment et on ne me laisse pas forcément le temps pour travailler (d'ou mes recherches le week end également).
J'ai bien lu attentivement vos deux réponses, et je vous remercie. J'ai réussi à adapter à d'autres données dans le code, et je suis en train de tout classer dans un fichier csv pour comparer des prix entre plusieurs sites, C'est top.

@parazitenew: J'ai joué la carte fu fichier temporaire, ça prend un peu plus de temps, j'dois mal m'y prendre, mais ça augmente la fiabilité. (cf code ci dessous partie "sleep", si je réduis la durée, ça bug aléatoirement... Peut être y a-t-il un moyen d'attendre la création du fichier?)

@ jguinch: Merci pour la réponse à ma seconde partie de question.

Code : Tout sélectionner

#include <String.au3>
#include <File.au3>
#include <Date.au3>

Dim $url = inputbox("Source", "inscrire ici l'url du site à analyser")
Dim $hDownload = InetGet($url, @WorkingDir & "\Test.txt", 1, 1)
Dim $sFldr1 = @WorkingDir&"\import\"
Dim $Date_us = _NowCalcDate()
Dim $Date_eu1 = StringRegExpReplace($Date_us, "\A(\d*)/(\d*)/(\d*)","$3/$2/$1")
Dim $Date_eu2 = StringReplace($Date_eu1,"/", "")
Dim $DossierFichier = $sFldr1&$Date_eu2&"_import.txt"
;Dim $rapport_data = "exemple"

; prévoir un contrôle de "erreur 404" et si erreur générer un log qui informe que le lien est mort
; prévoir le remplacement des des [\'] par ['] uniquement dans la désignation sur le site (exemple id 809) ou "é" par "é"

while FileExists("Test.txt")=0
Sleep(1000) ; on fait une pause, pour préserver le CPU
WEnd
$File=@WorkingDir & "\Test.txt"
$txt = FileRead($File)
$string1 = StringRegExp($txt, '<span><small>(.*?) € HT</small></span>', 1)

; ISOLATION DES VARIABLES
If IsArray($string1) Then $result = $string1[0]
;MsgBox(0,"Prix HT", "Le prix hors taxes du fournisseur est de "& $string1[0] &" €")
$string2 = StringRegExp($txt, "var id_product = (\d+)", 1)
If IsArray($string2) Then $result = $string2[0]
;MsgBox(0, "ID", "L'ID produit fournisseur est: " &$string2[0])
$string3 = _StringBetween ($txt, "var sharing_name = '","';")
;$string3 = StringReplace($string3, "é", "é")
If IsArray($string3) Then $result = $String3[0]
MsgBox(0, "ID", "Les informations concernent le produit: " &$string3[0])

;CREATION DU DOSSIER ET FICHIER
DirCreate($sFldr1)
$fh = FileOpen($DossierFichier, 1)
If $fh = -1 Then SetError(1, 0, 0)
Local $iWriteFile = FileWriteLine($fh, $string1[0]&";"&$string2[0]&";"&$string3[0])
Local $iRet = FileClose($fh)
If $iWriteFile = -1 Then SetError(2, $iRet, 0)

FileDelete ("Test.txt")
Je suis embetté par un problème de conversion entre fichier txt et csv, je vais regarder sur des forums spécialisés pour cela, c'est un peu hors sujet, mais lorsque je crée en txt, aucun problème de codage des caractères ("é" par "é") alors que quand je converti en csv y'en a un... C'est étrange. Bon, apparement, rien à voir avec autoit mais on sais jamais, si ça vous parle...

Avez vous des propositions d'amélioration de mon code? Je suis débutant en programmation et autoit est le premier language que j'apprend, je cherche à progresser. Si vous voulez le lien du site en MP no problemo :-)
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] Regex - extraire un string entre deux string connus

#5

Message par parazitenew »

Bonsoir,

Ton InetGet() n'est pas optimal. T'as mis '1' comme option du background, ce qui veut dire que ton script continue sans même attendre que le code html soit téléchargé et enregistré dans ton fichier texte. Il faut laisser par défaut, soit '0'.
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

Re: [..] Regex - extraire un string entre deux string connus

#6

Message par JulienBoul »

@ parazitenew: Merci de la correction, j'en ai profité pour relire la page d'aide concernant InetGet() car la lire avant utilisation (théorie pure) et après utilisation, ben c'est pas parreil, on comprend beaucoup plus facilement après coup. Merci de ton investissement :-)
Répondre