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 :

Recupération de table avec htmlagilitypack [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut Recupération de table avec htmlagilitypack
    Bonjour,

    Je cherche à remplacer des valeurs dans un tableau html par des liens hypertext.
    J'utilise donc htmlagilitypack.
    J'arrive à extraire mon tableau mais je n'arrive pas à parcourir les cellules à l'intérieur. Je pense que c'est à cause de la façon dont est écrit le code Html.
    En fait il faudrait que je puisse accéder à la dernière colonne du tableau.

    Si quelqu'un pourrait m'orienter ! Merci !

    Mon code VB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            Dim web As New HtmlWeb()
            Dim html As HtmlAgilityPack.HtmlDocument = web.Load("http://www2.fr.softcarrier.com/hbdb/sclinks/htmlkat/2/fr/html/22868.html")
     
     
            'On extrait le tableau
            For Each table As HtmlNode In html.DocumentNode.SelectNodes("//table").Where(Function(t) t.GetAttributeValue("class", "") = "im_themenkatalog_produktdaten")
                'On parcoure les lignes
                For Each row As HtmlNode In table.SelectNodes("./tr")
                    'On parcoure les cellules
                    For Each cell As HtmlNode In row.SelectNodes("./td")
                        'teste
                        Dim b = cell.InnerHtml
                    Next
                Next
            Next
    Et voici la partie html qui m’intéresse (j'ai pas tout mis, c'est plus simple!) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
        <table width="100%" class="im_themenkatalog_produktdaten">
            <tr style="background-color: #bfbfbf">
                <td>
                    <b>Produit</b>
                    <td>
                        <b>surface de projection en mm</b>
                        <td style="text-align: right;">
                            <b>Numéro de fabricant</b>
                            <td style="text-align: right;">
                                <b>Code</b>
                                <tr style="background-color: #efefef">
                                    <td>
                                        Mobile Boden-Leinwand MW MovieLux Compact
                                        <td>
                                            1600 x 1600 - Format: 1:1
                                            <td style="text-align: right;">
                                                13037
                                                <td style="text-align: right;">
                                                    70013037
                                                    <tr style="background-color: #efefef">
                                                        <td>
                                                            Ecran de projection mobile sur pied MW MovieLux Compact
                                                            <td>
                                                                1600 x 1200 - format: 4:3
                                                                <td style="text-align: right;">
                                                                    13036
                                                                    <td style="text-align: right;">
                                                                        70013036
                                                                        <tr style="background-color: #efefef">
                                                                            <td>
                                                                                Mobile Boden-Leinwand MW MovieLux Compact
                                                                                <td>
                                                                                    1200 x 900 - Format: 4:3
                                                                                    <td style="text-align: right;">
                                                                                        13035
                                                                                        <td style="text-align: right;">
                                                                                            70013035
                                                                                            <tr style="background-color: #efefef">
                                                                                                <td>
                                                                                                    <td>
                                                                                                        1800 x 1350 - Format: 4:3
                                                                                                        <td style="text-align: right;">
                                                                                                            13038
                                                                                                            <td style="text-align: right;">
                                                                                                                70013038
                                                                                                                <tr style="background-color: #efefef">
                                                                                                                    <td>
                                                                                                                        <td>
                                                                                                                            1940 x 1460 - Format: 4:3
                                                                                                                            <td style="text-align: right;">
                                                                                                                                130390
                                                                                                                                <td style="text-align: right;">
                                                                                                                                    70130390
                                                                                                                                </td>
                                                                                                                            </td>
                                                                                                                        </td>
                                                                                                                    </td>
                                                                                                                </tr>
                                                                                                            </td>
                                                                                                        </td>
                                                                                                    </td>
                                                                                                </td>
                                                                                            </tr>
                                                                                        </td>
                                                                                    </td>
                                                                                </td>
                                                                            </td>
                                                                        </tr>
                                                                    </td>
                                                                </td>
                                                            </td>
                                                        </td>
                                                    </tr>
                                                </td>
                                            </td>
                                        </td>
                                    </td>
                                </tr>
                            </td>
                        </td>
                    </td>
                </td>
            </tr>
        </table>

  2. #2
    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
    Euh, mais c'est n'importe quoi ce tableau
    Les <td> sont pas supposés être imbriqués, ça n'a pas de sens...

    Pour moi, dans ce code, il n'y a qu'une seule colonne, qui contient du gros n'importe quoi

    EDIT: c'est cette page ? ça correspond pas au code que tu as posté...

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    Heu non pas tout a fait cela, c'est celle là exactement : Page

    Ce n'est pas tout a fait les mêmes, par contre ta page à l'air d’être mieux écrite !

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    En fait le code est de bonne qualité sur le site !

    C'est lorsque je récupère le noeud <Table> que celui ci est mal formaté, enfin je pense, c'est ce que je récupere dans .outerhtml ....

    La suis perdu...

  5. #5
    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
    Effectivement y a un problème... il trouve qu'une seule ligne dans le tableau, avec une seule colonne

    En fait au départ j'ai testé en chargeant le document avec HtmlWeb, mais en le faisant avec WebClient + Stream, ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim wc = New WebClient()
    Dim doc = New HtmlDocument()
    Using stream = wc.OpenRead("http://www2.fr.softcarrier.com/hbdb/sclinks/htmlkat/2/fr/html/22868.html")
    	doc.Load(stream)
    End Using
    Ça ressemble fortement à un bug de HAP

    EDIT: effectivement : http://htmlagilitypack.codeplex.com/workitem/32107
    J'ai mentionné le fait que ça semble lié à HtmlWeb, mais j'ai pas l'impression que le projet soit encore maintenu...

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    Trop top, c'est bien ça
    Ça fonctionne mieux maintenant ! Merci !

  7. #7
    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
    En fouillant un peu dans le code de HAP, j'ai trouvé l'origine du problème; HtmlWeb force le flag OptionFixNestedTags à true, et apparemment il doit y avoir un bug dans l'implémentation de cette option... parce qu'au lieu de "réparer" les tags imbriqués, ça les casse

    EDIT: apparemment un patch a été proposé ici, mais ça fait 1 an et ça a toujours pas été intégré

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien de bureau d etude
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien de bureau d etude
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Points : 94
    Points
    94
    Par défaut Un autre Bug ?
    En continuant mes travaux je me suis rendu compte que j'avais des problèmes d'encodage et me retrouvait avec des caractères éronnés à la place des à, é, è etc...

    Voici le code avant avec l'encodage spécifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim wc = New WebClient()
            Dim doc = New HtmlDocument()
            wc.Encoding = System.Text.Encoding.UTF8
            Dim ErrorHttp As Boolean = False
     
            Try
                Using stream = wc.OpenRead("URL de la page")
                    doc.Load(stream)
                End Using
            Catch ex As WebException
                ErrorHttp = True
            End Try
    Cela fonctionnait mais retounait de mauvais caractères.

    Mon nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim wc = New WebClient()
            Dim doc = New HtmlDocument()
            wc.Encoding = System.Text.Encoding.UTF8
            Dim ErrorHttp As Boolean = False
     
            Try
                Dim Text As String = wc.DownloadString("URL de la page")
                doc.LoadHtml(Text)
     
            Catch ex As WebException
                ErrorHttp = True
            End Try
    Ici tout fonctionne mieux !

    Alors, Bug ou alors mauvaise manip ? Cela vient forcement de l'utilisation du stream, mais je ne sais pas pourquoi !

  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
    Dans ton premier code, l'encodage que tu spécifies sur le WebClient n'est pas utilisé, car tu charges directement le document à partir du Stream (qui n'a pas d'encodage vu que c'est juste un flux binaire). C'est donc HAP qui se débrouille pour détecter l'encodage approprié.

    Dans le deuxième, tu utilises DownloadString, donc le WebClient utilise l'encodage spécifié pour décoder la chaine à partir du Stream. Mais puisque la page n'est a priori pas en UTF-8, tu obtiens des caractères bizarres...

    Bref, à moins de connaître à l'avance l'encodage de la page à lire (ou si le serveur renvoie l'en-tête Content-Encoding), n'utilise pas DownloadString, car tu as de fortes chances de ne pas utiliser le bon encodage...

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

Discussions similaires

  1. Recupérer contenu d'un table avec javascript
    Par solicel dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/12/2009, 22h46
  2. [Access] Nom d'une table avec un espace dans SQL
    Par Corsaire dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 15h50
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01
  5. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 16h11

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