REGEX et parsing HTML [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: REGEX et parsing HTML [Résolu]

Message par Marc56 »

J'ai recopié plusieurs fois le bloc de texte exemple que tu as donné, en changeant les données, et ça marche avec cette nouvelle version.
RegEx un peu modifiée au début
(Code brouillon rapide)

Code : Tout sélectionner

EnableExplicit

Enumeration 
    #hFile  
    #RegEx
EndEnumeration

; --- Load datafile
If Not ReadFile(#hFile, "Datas.txt")
    MessageRequester("Error", "No data file")
    End
EndIf

Define Txt$ 
While Not Eof(#hFile)
    Txt$ = ReadString(#hFile, #PB_File_IgnoreEOL)
Wend    
CloseFile(#hFile)
; --- 

Define RegEx$ = ~"<tr.+&\">(.+)</a></td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>"

If Not CreateRegularExpression(#RegEx, RegEx$, #PB_RegularExpression_DotAll)
    Debug "Regex HS"
    Debug RegularExpressionError()
    End
EndIf

Procedure Extract_Line(One_Line$, ID)
    Protected i.a
    If ExamineRegularExpression(#RegEx, One_Line$)
        Define Nb_Cols = CountRegularExpressionGroups(#RegEx)
        While NextRegularExpressionMatch(#RegEx)
            For i = 1 To 10  
                Debug "" + RSet(Str(i), 2, " ") + ": " + RegularExpressionGroup(#RegEx, i)
            Next    
        Wend
        Debug "--- " + ID + " --------------------------------------------"
    EndIf
EndProcedure

Define i
For i = 1 To CountString(Txt$, "<tbody>") + 1
    Extract_Line(StringField(Txt$, i, "<tbody>"), i)  
Next

End
:wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: REGEX et parsing HTML [Résolu]

Message par Kwai chang caine »

Merci beaucoup Marc 8)
Effectivement chez moi ça marche niquel, cette fois plus de style ou autres "cochonailles" :D
Par contre ça écrit

Code : Tout sélectionner

--- 2 --------------------------------------------
et plus rien après :|
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: REGEX et parsing HTML [Résolu]

Message par Marc56 »

Mais comment cela peut-il ne pas fonctionner chez toi ?
Je viens de reprendre ton bloc de donnée d'exemple
J'ai enlevé la balise [ code ] qui semble en trop
J'ai collé trois fois de suite dans Notepad++ (utf-8 sans bom) (windows CR+LF)
je l'ai enregistré comme data.txt
J'ai repris mon code depuis le forum (je le fais à chaque fois que je fournis un code: je reteste ce que je poste)
Et chez moi ça marche (5.62 et 5.70b1 64 et 32 bits windows 10)
J'ai même essayé sur une machine virtuelle XP avec PB 5.70b1 32 bits
:?:

J'ai ça

Code : Tout sélectionner

--- 1 --------------------------------------------
 1: 29276985
 2: 45 AVENUE ROSA PARKS
 3: A
 4: RDC
 5: 
 6: 69009 LYON
 7: 000000000000
 8: 11111111
 9: En service
10: BOUDOU JEAN-CLAUDE
--- 2 --------------------------------------------
 1: 29276985
 2: 45 AVENUE ROSA PARKS
 3: A
 4: RDC
 5: 
 6: 69009 LYON
 7: 000000000000
 8: 11111111
 9: En service
10: BOUDOU JEAN-CLAUDE
--- 3 --------------------------------------------
 1: 29276985
 2: 45 AVENUE ROSA PARKS
 3: A
 4: RDC
 5: 
 6: 69009 LYON
 7: 000000000000
 8: 11111111
 9: En service
10: BOUDOU JEAN-CLAUDE
--- 4 --------------------------------------------
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: REGEX et parsing HTML [Résolu]

Message par Kwai chang caine »

J'ai trouvé le miasme, c'est ma faute :oops:
En fait ça se reproduit bien comme je te l'ai dit, sauf la première balise

Code : Tout sélectionner

<tbody>
qui ne se reproduit qu'au tout début et qui est le début du tableau et à la fin

Code : Tout sélectionner

</tbody>
pour fermer le tableau

Mais le problème c'est surtout la seconde

Code : Tout sélectionner

<tr class="odd">
la ligne d’après qui des fois y est et des fois non 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: REGEX et parsing HTML [Résolu]

Message par Marc56 »

effectivement, tbody marque le début d'un tableau.
Si les enregistrements de données sont des lignes du même tableau, alors il faut couper sur <tr

Code : Tout sélectionner

EnableExplicit

Enumeration
    #hFile 
    #RegEx
EndEnumeration

; --- Load datafile
If Not ReadFile(#hFile, "Datas2.txt")
    MessageRequester("Error", "No data file")
    End
Else
    Define Txt$
    While Not Eof(#hFile)
        Txt$ = ReadString(#hFile, #PB_File_IgnoreEOL)
    Wend   
    CloseFile(#hFile)
EndIf

Define RegEx$ = ~"&\">(.+)</a></td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>"

If Not CreateRegularExpression(#RegEx, RegEx$, #PB_RegularExpression_DotAll)
    Debug "Regex HS: " + RegularExpressionError()
    End
EndIf

Procedure Extract_Line(One_Line$)
    Protected i.a
    If ExamineRegularExpression(#RegEx, One_Line$)
        Define Nb_Cols = CountRegularExpressionGroups(#RegEx)
        While NextRegularExpressionMatch(#RegEx)
            For i = 1 To 10 
                Debug "" + RSet(Str(i), 2, " ") + ": " + RegularExpressionGroup(#RegEx, i)
            Next   
        Wend
        Debug ""
    EndIf
EndProcedure

Define i
For i = 1 To CountString(Txt$, "<tr") + 1
    Extract_Line(StringField(Txt$, i, "<tr")) 
Next

End
À toi de gérer les éventuelles lignes vides.

Et puisque c'est un simple tableau HTML, tu peux aussi le faire en basic pur avec les chaines de caractères:

Code : Tout sélectionner

Nouvel enregistrement: 			<tr ...
Répéter 10 fois
Séparateur gauche dde colonne 	">
	(champ1) (peut être vide)
Séparateur droit de colonne		</td
Next	
:wink:

"Think simple, think basic"
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: REGEX et parsing HTML [Résolu]

Message par Kwai chang caine »

Nadinozor !!!!
En REGEX t'es vraiment un cador !!! 8O


Ca marche du feu de dieu cette fois 8O
C'est pas hyper rapide, je croyais que les REGEX c'était ce qu'il y avait de plus rapide dans le parsing, mais c'est vraiment de la balle :D

Code : Tout sélectionner

~"&\">(.+)</a></td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>.+>(.*)</td>
Pfff et quand je pense qu'on dit que KCC est un grand malade j'te parle pas de l'inventeur de ce langage :mrgreen:

Je te remercie mille fois de t'être donné la peine de te casser la tête sur mon problème et te souhaite une excellente journée 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: REGEX et parsing HTML [Résolu]

Message par Marc56 »

Ce n'est pas rapide, parce que c'est très très mal fait. Je voulais juste de montrer le principe d'utilisation de la RegEx ici.
Si j'ai du temps, je referais mieux (comme dit tout programmeur pendant plusieurs dizaines d'années :mrgreen: )

Pour optimiser il faudrait que tu lises (je n'ai plus le lien), comment un moteur de regex "analyse" un texte (c'est un peu comme un logiciel de traduction, il doit "avancer" et "reculer")

Une RegEx aussi longue et avec 10 groupes () c'est une aberration :oops:
Normalement, on pointe une première balise de départ, puis on lance une autre RegeEx, puis une troisième.

Je ne suis pas sûr non plus que implémentation du moteur de RegEx (pourtant PCRE) dans PB soit aussi rapide que directement utilisé dans Perl par exemple. (il faudra que je fasse un test un jour)

Comme en SQL, il vaut mieux créer une vue et relancer une autre requête sur cette vue que de tout balayer à chaque fois.

:wink:
Dernière modification par Marc56 le lun. 09/juil./2018 16:16, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: REGEX et parsing HTML [Résolu]

Message par Kwai chang caine »

Aaaaah !! d'accord !!! 8O
Quoi qu'il en soit c'est quand même impressionnant :D

Faut drôlement être torturé pour inventer un truc pareil :|
Ca fait partie des choses qui nous rebutent et nous attirent en même temps
C'est pas un hasard si c'est féminin :mrgreen:
Encore merci pour tout 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: REGEX et parsing HTML [Résolu]

Message par poshu »

Marc56 a écrit :Normalement, on pointe une première balise de départ, puis on lance une autre RegeEx, puis une troisième.
C'est tellement évidant que j'y avais jamais pensé. Forcément, ça va vachement mieux marcher avec cette approche! Merci :3
Répondre