Page 2 sur 2

Re: REGEX et parsing HTML [Résolu]

Publié : dim. 08/juil./2018 16:53
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:

Re: REGEX et parsing HTML [Résolu]

Publié : dim. 08/juil./2018 17:07
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 :|

Re: REGEX et parsing HTML [Résolu]

Publié : dim. 08/juil./2018 17:21
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 --------------------------------------------

Re: REGEX et parsing HTML [Résolu]

Publié : dim. 08/juil./2018 17:47
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

Re: REGEX et parsing HTML [Résolu]

Publié : lun. 09/juil./2018 8:12
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"

Re: REGEX et parsing HTML [Résolu]

Publié : lun. 09/juil./2018 15:17
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)

Re: REGEX et parsing HTML [Résolu]

Publié : lun. 09/juil./2018 16:11
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:

Re: REGEX et parsing HTML [Résolu]

Publié : lun. 09/juil./2018 16:15
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)

Re: REGEX et parsing HTML [Résolu]

Publié : lun. 09/juil./2018 16:30
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