PureBasic

Forums PureBasic
Nous sommes le Mar 25/Sep/2018 18:41

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 24 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Dim 08/Juil/2018 16:53 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1379
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:
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:

_________________
Windows 10 x64 - CPU intel i3 - RAM 16Go - Video NVidia GT 620 - 1920x1080
Linux Slackware et Debian 64bits / xfce - (VirtualBox 5)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Dim 08/Juil/2018 17:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6545
Localisation: Isere
Merci beaucoup Marc 8)
Effectivement chez moi ça marche niquel, cette fois plus de style ou autres "cochonailles" :D
Par contre ça écrit
Code:
--- 2 --------------------------------------------

et plus rien après :|

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Dim 08/Juil/2018 17:21 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1379
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:
--- 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 --------------------------------------------

_________________
Windows 10 x64 - CPU intel i3 - RAM 16Go - Video NVidia GT 620 - 1920x1080
Linux Slackware et Debian 64bits / xfce - (VirtualBox 5)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Dim 08/Juil/2018 17:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6545
Localisation: Isere
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:
<tbody>
qui ne se reproduit qu'au tout début et qui est le début du tableau et à la fin
Code:
</tbody>
pour fermer le tableau

Mais le problème c'est surtout la seconde
Code:
<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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Lun 09/Juil/2018 8:12 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1379
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:
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:
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"

_________________
Windows 10 x64 - CPU intel i3 - RAM 16Go - Video NVidia GT 620 - 1920x1080
Linux Slackware et Debian 64bits / xfce - (VirtualBox 5)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Lun 09/Juil/2018 15:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6545
Localisation: Isere
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:
~"&\">(.+)</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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Lun 09/Juil/2018 16:11 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1379
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:

_________________
Windows 10 x64 - CPU intel i3 - RAM 16Go - Video NVidia GT 620 - 1920x1080
Linux Slackware et Debian 64bits / xfce - (VirtualBox 5)


Dernière édition par Marc56 le Lun 09/Juil/2018 16:16, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Lun 09/Juil/2018 16:15 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6545
Localisation: Isere
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: REGEX et parsing HTML [Résolu]
MessagePosté: Lun 09/Juil/2018 16:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 31/Juil/2004 22:32
Messages: 1125
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


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 24 messages ]  Aller à la page Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye