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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    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 Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    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 : 43
    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
    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 averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    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 averti
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 42
    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
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    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 067
    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.

+ 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