IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Regex pour parser HTML


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Points : 18
    Points
    18
    Par défaut Regex pour parser HTML
    Bonjour,

    Je cherche à récupérer le texte (avec une regex) contenu entre les balises <a href et img.

    Par exemple, le code HTML suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... <a href="www.google.fr"><img src="www.google.fr/images"></a> ...
    devrait me retourner ="www.google.fr" et src="www.google.fr/images", ce qui n'est pas le cas.

    Bien sur je sais que le problème vient de ma regex, mais je n'arrive pas à en construire une correcte (malgré le cours de P. Plasserres).

    Voici mon code actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Protected Sub parseHTML(ByRef HTML As String)
        Dim pattern As String = "[<a href]([^>]+)[><img ]([^>]+)[></a>]"
        Dim matches As MatchCollection = Regex.Matches(HTML, pattern)
        For Each match As Match In matches
            Debug.WriteLine("HREF " & match.Groups(1).Value)
            Debug.WriteLine("IMG " & match.Groups(2).Value)
        Next
    End Sub
    Toute aide sera la bienvenue. Merci par avance,

    Furior

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim pattern As String = "((?<=href=).+?)><img (.+?(?=>))"
    Edit :
    Un minimum d'explication :

    ((?<=href=).+?)><img (.+?(?=>)) : on défini deux groupes avec les parenthèses.

    ((?<=href=).+?)><img (.+?(?=>)) : ces groupes pourront être composés de n'importe quel caractère sauf la fin de ligne avec une recherche au plus court.

    ((?<=href=).+?)><img (.+?(?=>))
    : l'expression que l'on impose de trouver entre les deux groupes et qui n'en fait pas partie. (Nota : on intègre un espace en fin).

    ((?<=href=).+?)><img (.+?(?=>)) : le premier groupe doit commencer par "href=" qui ne sera pas capturé (postanalyse positive).

    ((?<=href=).+?)><img (.+?(?=>)) : le second groupe doit finir par ">", également non capturé (préanalyse positive).

    Tout est très bien expliqué .

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Les expressions régulières ne sont pas le bon outil pour parser du HTML, car celui-ci n'est pas un langage régulier. Alors bien sûr, dans les cas simples comme celui-ci, on peut toujours bidouiller pour obtenir ce qu'on veut, mais en général il vaut mieux utiliser un outil spécifique, comme HTML Agility Pack :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim doc As New HtmlDocument()
    doc.Load(fileName)
    For Each link As HtmlNode In doc.DocumentElement.SelectNodes("//a[@href"])
        Dim attr As HtmlAttribute = link("href");
        Dim url As String = attr.Value
    Next

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos deux réponses.

    L'expression proposée par chrismonoye a exactement le comportement que j'attendais.

    Quand à HTML agility, je l'ai testé et je pense que c'est effectivement mieux pour parser.

    Par contre il y avait quelques erreurs dans ton code tomlev, du coup je poste le code corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim doc As New HtmlDocument
        doc.LoadHtml(stringHTMLSourceCode)
        For Each link As HtmlNode In doc.DocumentNode.SelectNodes("//a[@href]")
            Dim attrs As HtmlAttributeCollection = link.Attributes
            Dim attr As HtmlAttribute = attrs.Item("href")
            Dim url As String = attr.Value
        Next
    Merci à vous deux, je passe en résolu.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,
    Je cherche pratiquement la même solution.
    j'ai une variable qui contient :

    h2 class="nameCli">" <a href="http://www.xxxxxxxx> nom 1 </a>"
    <div class="addr"><ul> <li> adresse 1 </li>"
    <li class="call"> <span>Tél. :</span> num 1 </li>"


    <h2 class="nameCli">" <a href="http://www.xxxxxxxx> nom 2 </a>"
    <div class="addr"><ul> <li> adresse 2 </li>"
    <li class="call"> <span>Tél. :</span> num 2 </li>"


    <h2 class="nameCli">" <a href="http://www.xxxxxxxx> nom 3 </a>"
    <div class="addr"><ul> <li> adresse 3 </li>"
    <li class="call"> <span>Tél. :</span> num 3 </li>"


    Je veux avoir dans un fichier cette forme :
    nom1 , adresse 1 , num 1
    nom2 , adresse 2 , num 2
    nom3 , adresse 3 , num 3

    Est-ce possible ?

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Pourquoi ne pas traiter ton fichier comme un fichier XML, tu pourras utiliser LinqToXML pour récupérer les données qui t'intéressent.

  7. #7
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Pourquoi ne pas traiter ton fichier comme un fichier XML
    Tout simplement car un fichier HTML n'est pas un fichier XML même si ca y ressemble. Il faut donc utiliser un parser HTML et non XML

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    dans le cas de Meher001 la structure de son fichier est très proche de celui d'un xml avec le même schéma qui se répète

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    dans le cas de Meher001 la structure de son fichier est très proche de celui d'un xml avec le même schéma qui se répète
    Oui mais "proche" ce n'est pas suffisant pour un parseur XML... HTML est beaucoup moins strict que XML, et certaines "erreurs" qui sont tolérées par les parseurs HTML (éléments non refermés, attributs sans guillemets, etc) ne seront pas du tout supportées par un parseur XML, qui échouera complètement à charger le fichier.

    HTML Agility Pack est fait pour gérer ce genre de choses, et s'utilise d'ailleurs quasiment de la même façon que Linq to XML. J'ai écrit un article à ce sujet il y a quelques mois (c'est du C#, mais à part les diffférences de syntaxe c'est pareil en VB.NET)

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Oui mais "proche" ce n'est pas suffisant pour un parseur XML... HTML est beaucoup moins strict que XML, et certaines "erreurs" qui sont tolérées par les parseurs HTML (éléments non refermés, attributs sans guillemets, etc) ne seront pas du tout supportées par un parseur XML, qui échouera complètement à charger le fichier.

    HTML Agility Pack est fait pour gérer ce genre de choses, et s'utilise d'ailleurs quasiment de la même façon que Linq to XML. J'ai écrit un article à ce sujet il y a quelques mois (c'est du C#, mais à part les diffférences de syntaxe c'est pareil en VB.NET)
    Je vois ça, ça a l'air pas mal manquerai plus que ça gère la sérialisation

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    manquerai plus que ça gère la sérialisation
    la sérialisation en HTML ?
    pour quoi faire ?

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Les mais c'est bon j'ai trouvé la solution avec un fichier html ou json qui on la même structure que xml et ça marche très bien.
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simple Regex pour parser un entete de fichier
    Par eric.bryan dans le forum C#
    Réponses: 0
    Dernier message: 05/09/2013, 22h52
  2. [RegEx] Regex pour parser une page web
    Par cyberlp dans le forum Langage
    Réponses: 8
    Dernier message: 11/12/2011, 05h12
  3. Probléme pour parser HTML
    Par hikrab dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/01/2008, 10h30
  4. [Html] HTMLPARSER pour parser du html en Java
    Par alexthomas dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/09/2005, 21h11
  5. [Parser HTML] quel parser utiliser pour du HTML 4.0 ?
    Par Cyber@l dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/07/2004, 19h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo