none
Comment détecter un tag dans une page Xhtml avec HtmlAgilityPack RRS feed

  • Question

  • Bonjour

    J'ai dans page web assez complexe la ligne suivante :


    <div class="global-menu-name"><img src="images/f.png" /><a href="hhhhh">FirstName</a> <a href="kkkkkkkkkkkkkkkk">Name</a></div>

    Je souhaite détecter cette ligne et extraire ls liens "hhhhh" "kkkkkkkkkkkkk" puis FirstName et Name.

    Cette div n'est pas un fils direct du noeud Body  

    J'ai essayé avec 

    Dim NoeudGw_Menu As HtmlNode = HtmlDoc.DocumentNode.SelectSingleNode("//div[@class='global-menu-name']")
    Mais cela ne marche pas et me renvoie toujours Nothing

    J'ai essayé avec la méthode DocumentNode.DEscendants sans succès

    Donc comment faire pour détecter un TAG qui n'est pas un fils direct du noeud racine ?
    Merci

    Bernard


    Bernard Bourée

    lundi 15 février 2016 20:29

Réponses

  • Juste pour votre exemple avec RegEx on peut faire les pattern successivement pour sortir les éléments.

    Voici ce que cela donne:

    Et le code:

    pattern = "<a" & "(.+?)" & "/a>"
            Dim MatchResultCollection As MatchCollection
    
            For Each Input In TestStrings
                RichTextBox5.AppendText(Input & Environment.NewLine)
                MatchResultCollection = Regex.Matches(Input, pattern)
                For Each myMatches As Match In MatchResultCollection
                    ' On a un groupe entre <a /a>
                    Dim groupMatch As Group = myMatches.Groups(1)
                    RichTextBox4.AppendText("Trouvé un Match ""<a(.+?)/a>"" = " & groupMatch.Value & Environment.NewLine)
                    'Maintenant les href
                    Dim patternHref As String = "href=" & "(.+?)" & ">"
                    Dim regExHref As New Regex(patternHref)
                    Dim mhref As Match = regExHref.Match(groupMatch.Value)
                    If mhref.Success Then
                        RichTextBox4.AppendText("Trouvé un Match ""href=(.+?)>""  = " & mhref.Groups(1).ToString() & Environment.NewLine)
                    End If
                    'Maintenant les Noms etc
                    Dim patternNomEtc As String = ">" & "(.+?)" & "<"
                    Dim regexNomEtc As New Regex(patternNomEtc)
                    Dim mNomEtc As Match = regexNomEtc.Match(groupMatch.Value)
                    If mNomEtc.Success Then
                        RichTextBox4.AppendText("Trouvé un Match "">(.+?)<"" = " & mNomEtc.Groups(1).ToString() & Environment.NewLine)
                    End If
                    RichTextBox4.AppendText(Environment.NewLine)
                Next
    
            Next
    Il est possible de combiner les "patterns" en un seul RegEx et d'avoir les champs rangés dans les groupes, mais je vous laisse explorer les Expressions Régulières dans msdn.


    Cyrille Precetti

    lundi 15 février 2016 21:31
  • Bonjour,

    Vous avez un document Xml alors autant en profiter. En utilisant XPath vous devriez pouvoir y arriver.

    Un exemple ici : http://stackoverflow.com/questions/15826875/html-agility-pack-using-xpath-to-get-a-single-node-object-reference-not-set

    (en plus c'est Simon qui répond ;-))


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mardi 16 février 2016 06:49

Toutes les réponses

  • Est-ce que vos ligne HTML sont dans une liste de String?

    Si c'est le cas vous pouvez utilisez un "pattern" et la méthode RegEx pour trouver les éléments.


    Cyrille Precetti

    lundi 15 février 2016 20:53
  • Juste pour votre exemple avec RegEx on peut faire les pattern successivement pour sortir les éléments.

    Voici ce que cela donne:

    Et le code:

    pattern = "<a" & "(.+?)" & "/a>"
            Dim MatchResultCollection As MatchCollection
    
            For Each Input In TestStrings
                RichTextBox5.AppendText(Input & Environment.NewLine)
                MatchResultCollection = Regex.Matches(Input, pattern)
                For Each myMatches As Match In MatchResultCollection
                    ' On a un groupe entre <a /a>
                    Dim groupMatch As Group = myMatches.Groups(1)
                    RichTextBox4.AppendText("Trouvé un Match ""<a(.+?)/a>"" = " & groupMatch.Value & Environment.NewLine)
                    'Maintenant les href
                    Dim patternHref As String = "href=" & "(.+?)" & ">"
                    Dim regExHref As New Regex(patternHref)
                    Dim mhref As Match = regExHref.Match(groupMatch.Value)
                    If mhref.Success Then
                        RichTextBox4.AppendText("Trouvé un Match ""href=(.+?)>""  = " & mhref.Groups(1).ToString() & Environment.NewLine)
                    End If
                    'Maintenant les Noms etc
                    Dim patternNomEtc As String = ">" & "(.+?)" & "<"
                    Dim regexNomEtc As New Regex(patternNomEtc)
                    Dim mNomEtc As Match = regexNomEtc.Match(groupMatch.Value)
                    If mNomEtc.Success Then
                        RichTextBox4.AppendText("Trouvé un Match "">(.+?)<"" = " & mNomEtc.Groups(1).ToString() & Environment.NewLine)
                    End If
                    RichTextBox4.AppendText(Environment.NewLine)
                Next
    
            Next
    Il est possible de combiner les "patterns" en un seul RegEx et d'avoir les champs rangés dans les groupes, mais je vous laisse explorer les Expressions Régulières dans msdn.


    Cyrille Precetti

    lundi 15 février 2016 21:31
  • Bonjour,

    Vous avez un document Xml alors autant en profiter. En utilisant XPath vous devriez pouvoir y arriver.

    Un exemple ici : http://stackoverflow.com/questions/15826875/html-agility-pack-using-xpath-to-get-a-single-node-object-reference-not-set

    (en plus c'est Simon qui répond ;-))


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mardi 16 février 2016 06:49