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

Re: REGEX et parsing HTML [Résolu]
Publié : dim. 08/juil./2018 17:07
par Kwai chang caine
Merci beaucoup Marc
Effectivement chez moi ça marche niquel, cette fois plus de style ou autres "cochonailles"
Par contre ça écrit
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
En fait ça se reproduit bien comme je te l'ai dit, sauf la première balise
qui ne se reproduit qu'au tout début et qui est le début du tableau et à la fin
pour fermer le tableau
Mais le problème c'est surtout la seconde
la ligne d’après qui des fois y est et des fois non

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
"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 !!!
Ca marche du feu de dieu cette fois
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
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
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

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 
)
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
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.

Re: REGEX et parsing HTML [Résolu]
Publié : lun. 09/juil./2018 16:15
par Kwai chang caine
Aaaaah !! d'accord !!!
Quoi qu'il en soit c'est quand même impressionnant
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

Encore merci pour tout

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