Isoler un texte depuis une balise (expressions regulieres ?)

[Résolu]
Signaler
Messages postés
19
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
30 avril 2008
-
Messages postés
19
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
30 avril 2008
-
Bonjour,

Je commence par un topo de mon application. Je réalise actuellement un projet assez vaste (environ 1 an de développement). Il s'agit d'un moteur de recherche ayant pour but de référencer tout ce qui existe sur le net (de la page web au lien rss, ed2k, chat irc, serveur smtp, pop... bref, un accès direct à chaque ressource du monde web). Ce projet est divisé en 5 outils, eux mêmes tapant dans 3 bases de données mysql. Le principe de fonctionnement est similaire à [mailto:folding@home : un folding@home : un] serveur principal, plusieurs sous serveurs, et le but avoir des milliers de clients qui "traitent" les packages disponibles. Ce moteur de recherche est recursif, à partir du moment ou on le lance, celui-ci s'enrichit tout seul des objets trouvés par les clients, etc, etc... mais ce moteur de recherche n'est pas un outil commercial, il a pour but certes de générer du revenu ET une majeure partie de celui-ci est donné aux associations caricatives dans le monde, des oeuvres pour lutter contre le sida, le cancer, toutes sortes de maladies mais également à aider les plus démunis des PEVD, bref aider son prochain sans dépenser directement des ressouces financières. Je supporte actuellement seul les coûts de développement et de structures (serveur, nom de domaine, hébergement).

Bref, voici pour le projet, en quelques lignes. A présent, j'ai réaliser les 2 premiers modules (serveurs et sous serveurs) ainsi qu'une bonne partir du client. A présent, je souhaite analyser les webpage. Celles-ci arrivent dans un package (fichier XML) que le client a prix (gripp) et qu'il doit traiter (fill). il s'agit la du code de la page web.
Ce que je voudrais, c'est pouvoir extraire les données entre des balises définis (ces balises existent déjà et le client "sait" ce qu'il doit extraire comme données), la question c'est comment ? Expressions régulières ?

Ex : je veux extraire le contenu se trouvant entre <title>test</title>, ou bien dans le header comme cela <meta name="author" content="Nix">, je devrai donc avoir un résultat comme celui ci après analyse :
title_page="test"
meta_author="Nix"...

Ca devra aussi faire de même pour les emails (ex depuis [mailto:test@gmail.com mailto:test@gmail.com] qui sortira mail=test[mailto:mail=test@gmail.com @gmail.com]) ou des liens ed2k (ex: <ed2k://ressouce>ressources_nom</ed2k> qui sortira ed2k=ressource:nom_ressources), et plus généralement tous les types de balises défnis par l'application.

En somme, c'est une extraction de textes, je pense que les ER peuvent remplir parfaitement ce rôle, de façon rapide, fiable et à ne pas pénaliser le client, merci de me dire si c'est  le cas. Pour ma part, j'attend des réponses concrêtes à cette logique.

Je vous demande de bien vouloir croire en ce projet,
Cordialement;
kkZ

Ps : pour avoir des données concrêtes, enregistrer simplement la source de cette page et tentez de faire une extraction depuis quelques balises. c'est simple mais je m'y heurte quelque peu.

Me... kkZ

6 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
testé, OK

Private Sub Form_Load()
    Dim lStart As Long, sRet As String
    lStart = 1
    
    Do While lStart
        sRet = MyMid("mailto:test1@gmail.com
mailto:test2@gmail.com mailto:test3@gmail.com mailto:test4@gmail.com bla bla bla
évidemment mailto:test5@gmail.com ", "mailto:", "
", lStart)
        If LenB(sRet) Then Debug.Print "mail=" & Chr$(34) & sRet & Chr$(34)
    Loop
    
    Unload Me
End Sub

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Intéresse toi aux techniques utilisées pour le coloriage syntaxique du langage HTML : il y a plein d'exemples.
Tu y trouveras bien des idées.
Regarde aussi du côté du XML

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
salut,

Récupérer une chaîne (inconnue) placée entre deux chaînes (connues)

Private Function MyMid(ByRef Expression As String, sLeft As String, sRight As String, Optional Start As Long = 1) As
String
    Dim lPosL As Long, lPosR As Long
    lPosL = InStr(Start, Expression, sLeft): lPosR = InStr(lPosL + 1, Expression,
sRight)
    If lPosL > 0 And lPosR > 0 Then
        MyMid = Mid$(Expression, lPosL + Len(sLeft), lPosR - lPosL - Len(sLeft))
    Else
        MyMid = vbNullString
    End If
End Function

Private Sub Form_Load()
    MsgBox "title_page=" & Chr$(34) & MyMid("<title>isoler un texte depuis une balise (expressions
regulieres ?) - Algorithme / Maths, Visual Basic, VB6, VB.NET, VB 2005,
VB</title>", "<title>", "</title>") & Chr$(34)
    MsgBox "meta_author=" & Chr$(34) & MyMid("<meta name='author'
content='Nix' />", "content='", "' />") & Chr$(34)
    MsgBox "mail=" & Chr$(34) & MyMid("mailto:test@gmail.com
", "mailto:", " ") & Chr$(34)
    MsgBox "edk=ressource:" & Chr$(34) & MyMid("<ed2k://ressouce>ressources_nom</ed2k>", "<ed2k://ressouce>", "</ed2k>") & Chr$(34)
    
    Unload Me
End Sub

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
19
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
30 avril 2008

Merci pour toutes ces réponses,
j'avais déjà trouvé ce code sur codyx. Il fonctione très bien et réaliser parfaitement l'opération mais j'ai peur que, le fonctionnement de l'appli étant récursif, cela pénalise les performances.

Je vais continuer sur cette voie mais je prend tout ce qui est en rapport avec les expressions régulières.

Cordialement,
Me... kkZ
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
légère modif alors :

Private Function MyMid(ByVALExpression As String, sLeft As String, sRight As String,<strike>Optional</strike> ByRef Start As Long <strike>= 1</strike>) As String
    Dim lPosL As Long, lPosR As Long
    lPosL = InStr(Start, Expression, sLeft): lPosR = InStr(lPosL + 1, Expression, sRight)
    If lPosL > 0 And lPosR > 0 Then
        MyMid = Mid$(Expression, lPosL + Len(sLeft), lPosR - lPosL - Len(sLeft))
        Start=lposr+len(sright)
    Else
        MyMid = vbNullString
        Start=0
    End If
End Function

plus qu'à déclarer un lStart initialisé à 1 et boucler tant que <>0

pas testé mais çà devrait être bon...
(attention à bien supprimer ce que j'ai rayé!)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
19
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
30 avril 2008

Encore merci pour ces réponses,
j'ai pu déjà utiliser ce code à ma façon et cela fonctionne très bien.
Je suis à présent en mesure de récupérer la totalité des balises désirées et cela de façon recursive.
Si vous avez des sources avec une utilisation en REGEXP, je suis preneur (certain que cela se fait mais je suis encore en train d'apprendre correctement l'utilisation -et c'est pas évident-)

Me... kkZ