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

C# Discussion :

HtmlAgilityPack problème de code [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 10
    Points
    10
    Par défaut HtmlAgilityPack problème de code
    Bonjour,

    je cherche à récupérer le dernier tirage du kéno sur un listView par l'intermédiaire de HtmlAgility. Mon problème c'est que par le fait que j'appelle les balise <p> je me retrouve avec 40 numéros soit les deux tirages du jour au lieu de 20 que je voudrais et là je bloque complètement. Il serais sympa de me donner une piste pour limiter le foreach à 20 lignes. voir mon code

    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
    string url = "https://www.fdj.fr/jeux/jeux-de-tirage/keno/resultats";
                HtmlWeb web = new HtmlWeb();
                HtmlAgilityPack.HtmlDocument doc = web.Load(url);
     
                var ensemble = (from node in doc.DocumentNode.Descendants("p")
                                where node.Attributes.Contains("class")
                                where node.Attributes["class"].Value == "keno_num"
                                select node);
     
                foreach (HtmlAgilityPack.HtmlNode p in ensemble)
                {
     
                    relever_numeros.Items.Add("" + p.InnerText);
     
                }
    Merci par avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Tu as deux solutions dont une qui me semble plus adaptée a ton besoin :
    Une boucle "for", sinon tu peux garder ton "foreach" avec un compteur.

    Exemple :
    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
    Console.WriteLine("For exemple");
                for (int i = 0; i < 20; i++)
                {
                    Console.WriteLine(i);
                }
     
                Console.WriteLine("Foreach exemple");
                List<int> elements = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
                int maxElement = 10;
                int compteur = 0;
                foreach (var element in elements)
                {
                    compteur++;
                    Console.WriteLine(element);
                    if (compteur == maxElement)
                        break;
                }

  3. #3
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Un simple Take devrait fonctionner non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var skipList = ensemble.Take(10);
     
    foreach(var item in skipList)
    {
    	relever_numeros.Items.Add("" + p.InnerText);
    }
    " Je préfère comprendre les gens qui ne me comprennent pas "

  4. #4
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci pour la solution le code pour tous.


    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
    relever_numeros.Items.Clear();
     
                int compteur = 0;
                int maxElement = 21;
     
                string url = "https://www.fdj.fr/jeux/jeux-de-tirage/keno/resultats";
                HtmlWeb web = new HtmlWeb();
                HtmlAgilityPack.HtmlDocument doc = web.Load(url);
     
     
                 var ensemble = (from node in doc.DocumentNode.Descendants("p")
                                where node.Attributes.Contains("class")
                                where node.Attributes["class"].Value == "keno_num"
                                select node);
     
     
     
                 foreach (HtmlAgilityPack.HtmlNode p in ensemble)
                 {
     
                    compteur++;
                    if (compteur == maxElement) break;
                    relever_numeros.Items.Add("" + p.InnerText);
     
                 }

  5. #5
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Euh le Take ne fonctionne pas ?
    Car cette solution est quand même moyenne, tu fais une condition et un break juste pour tester un compteur !

    Au pire si le take ne fonctionne pas, fait le avec un for, ce sera plus performant et surtout plus lisible !
    " Je préfère comprendre les gens qui ne me comprennent pas "

  6. #6
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je vais voir Merci

  7. #7
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Je confirme que le take est certainement la meilleur solution.

    Et la moins bonne est bien le foreach break;

  8. #8
    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 katkiller Voir le message
    Je confirme que le take est certainement la meilleur solution.
    Et la moins bonne est bien le foreach break;
    Meilleur ou moins bonne dans quel sens ?

    Car cette solution est quand même moyenne, tu fais une condition et un break juste pour tester un compteur !
    Pour info Take fait exactement un foreach break. Donc à par réécrire une méthode qui existe déjà, ça ne change pas grand chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        private static IEnumerable<TSource> TakeIterator<TSource>(IEnumerable<TSource> source, int count)
        {
          if (count > 0)
          {
            foreach (TSource item in source)
            {
              yield return item;
              if (--count == 0)
                break;
            }
          }
        }

  9. #9
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par meziantou Voir le message
    Pour info Take fait exactement un foreach break. Donc à par réécrire une méthode qui existe déjà, ça ne change pas grand chose.
    Merci pour l'info

  10. #10
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Autant pour moi, je n'avais pas regarder l'implémentation du Take

    Du coup le Take (pour ne pas réécrire la méthode) doit être mieux que le for étant donné qu'il s'agit d'un Enumerable (yield) ?
    Après je n'ai pas regardé le source du HtmlAgilityPack
    " Je préfère comprendre les gens qui ne me comprennent pas "

  11. #11
    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 Jabbal'H Voir le message
    Du coup le Take (pour ne pas réécrire la méthode) doit être mieux que le for étant donné qu'il s'agit d'un Enumerable (yield) ?
    Mieux dans quel sens?

  12. #12
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Chargement différé non ? => le yield ?
    L'iterateur n'est pas entièrement chargé, contrairement à un for où il faudrait passer par une liste, ce qui force le chargement complet.
    Non ?
    " Je préfère comprendre les gens qui ne me comprennent pas "

  13. #13
    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
    A partir du moment où la source est de type IEnumerable<T>, je ne vois pas trop pourquoi tu le fais avec une boucle for mais si tu insistes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                using (var enumerator = source.GetEnumerator())
                {
                    for (int i = 0; enumerator.MoveNext() && i < 10; i++)
                    {
                        Console.WriteLine(enumerator.Current);
                    }
                }

  14. #14
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    ^^ Non c'est pas ce que je voulais dire
    Lorsque je disais forcer le chargement, c'est faire çà : enumerateur.ToList()
    On charge l'intégralité de la liste, ce qui est contre performant dans ce cas.
    Je pense que c'était la solution du for indiqué dans la 1ère réponse
    " Je préfère comprendre les gens qui ne me comprennent pas "

  15. #15
    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
    C'est sûr qu'il faut éviter de faire n'importe quoi. A moins de vouloir itérer plusieurs fois sur les éléments, il faut éviter le ToList().

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

Discussions similaires

  1. problème de code avec un tableau
    Par richard038 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2006, 17h35
  2. problème de code javascript pour une vue 360°
    Par tomguiss dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/03/2006, 22h50
  3. [POO] Problème de code PHP avec Internet Explorer
    Par bzoler dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2006, 11h00
  4. Problème de code besoin d un petit depannage
    Par rakengoule dans le forum MFC
    Réponses: 3
    Dernier message: 10/10/2005, 16h25
  5. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

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