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

API standards et tierces Java Discussion :

HTMLParser et problème avec le nombre de requètes


Sujet :

API standards et tierces Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 11
    Par défaut HTMLParser et problème avec le nombre de requètes
    Bonjour,
    J'utilise la classe HTMLParser (org.htmlparser) pour récupérer des informations sur un site internet.

    Mon problème est que je n'arrive pas à utiliser un seul et même parser pour récupérer plusieurs informations sur la page en question !

    Je m'explique avec deux exemples :

    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
     
       String url;
     
       public MaClasse(String url) {
            this.url = url;
        }
     
       public void get1() {
            try {
     
                Parser parserFiche = new Parser(url);
     
                // Mon premier filtre
                NodeFilter filter1 =
                        new AndFilter(new TagNameFilter("h2"),
                        new HasParentFilter(new TagNameFilter("td")));
     
                NodeList nl = parserFiche.extractAllNodesThatMatch(filter1);
                NodeIterator i = nl.elements();
                while(i.hasMoreNodes()) {
                    Node courant = i.nextNode();
                    // Boucle sur les différentes réponses
                }
            } catch (Exception e) {
                System.out.println("Erreur : " + e);
            }
        }
     
       public void get2() {
            try {
     
                Parser parserFiche = new Parser(url);
     
                // Mon deuxieme filtre
                NodeFilter filter2 =
                        new AndFilter(new TagNameFilter("html"),
                        new HasParentFilter(new TagNameFilter("body")));
     
                NodeList nl = parserFiche.extractAllNodesThatMatch(filter2);
                NodeIterator i = nl.elements();
                while(i.hasMoreNodes()) {
                    Node courant = i.nextNode();
                    // Boucle sur les différentes réponses
                }
            } catch (Exception e) {
                System.out.println("Erreur : " + e);
            }
        }
    Cette méthode fonctionne, mais le problème est que la même page (url) sera appelé plusieurs fois (si je me trompe pas ?????).
    Donc si j'ai besoin de 50 infos sur la page (donc 50 méhodes "get"), la page sera récupéré 50 fois, ce qui est plus long, moins logique, et cela "spam" le site web (50 requêtes sur la même page)

    C'est pour cela qu'il est plus logique de faire ceci :

    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
     
       Parser parserFiche;
     
       public MaClasse(String url) {
            this.parserFiche = new Parser(url);
        }
     
       public void get1() {
            try {
     
                // Mon premier filtre
                NodeFilter filter1 =
                        new AndFilter(new TagNameFilter("h2"),
                        new HasParentFilter(new TagNameFilter("td")));
     
                NodeList nl = parserFiche.extractAllNodesThatMatch(filter1);
                NodeIterator i = nl.elements();
                while(i.hasMoreNodes()) {
                    Node courant = i.nextNode();
                    // Boucle sur les différentes réponses
                }
            } catch (Exception e) {
                System.out.println("Erreur : " + e);
            }
        }
     
       public void get2() {
            try {
     
                // Mon deuxieme filtre
                NodeFilter filter2 =
                        new AndFilter(new TagNameFilter("html"),
                        new HasParentFilter(new TagNameFilter("body")));
     
                NodeList nl = parserFiche.extractAllNodesThatMatch(filter2);
                NodeIterator i = nl.elements();
                while(i.hasMoreNodes()) {
                    Node courant = i.nextNode();
                    // Boucle sur les différentes réponses
                }
            } catch (Exception e) {
                System.out.println("Erreur : " + e);
            }
        }
    Cette façon de faire est bien plus propre et bien plus logique, mais le problème c'est que cela fonctionne pour la première méthode get qui sera appelé, mais dès que l'on appelle une deuxième méthode get (peu importe laquelle) cela ne fonctionne plus (on ne peux pas récupérer une deuxième liste de node avec un autre filtre apparemment).

    Si quelqu'un à la moindre information, cela m'intéresse fortement, car je ne sait pas du tout comment cela se fait, et encore moins comment y remédier sans utiliser la première méthode qui fonctionne).

    Merci par avance ! Et bonne année à tous !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Je connais pas cette bibliothèque. J'ai jeté un œil rapide à l'API proposée, et ça m'a pas l'air très pratique pour tout. Notamment pas pour ce dont tu as besoin.

    Mais bref : puisqu'apparemment tu ne peux pas parser plusieurs fois sans faire plusieurs appels à l'URL, alors ne le fais pas. Trois solutions :
    - Récupère la page à l'URL en question, stocke-là en mémoire, et parse plutôt ça.
    - N'applique pas de filtre de parsing. Appelle juste Parser.parse(), avec un NodeFilter null, ce qui a pour effet de renvoyer un objet représentant la page entière. Stocke-le et fais tes recherches là-dedans (j'admets, ça n'a pas l'air bien prévu pour.)
    - Appelle plutôt Parser.visitAllNodesWith() avec un NodeVisitor capable de chercher toutes les infos dont tu as besoin. Je n'ai pas trouvé de classe fournie pour composer différents NodeVisitors ou simplifier la recherche d'un nœud précis, mais ça n'a pas l'air compliqué à faire.

    Hm. Je ne connais pas de bibliothèque pour parser du HTML non-XML... Mais j'en chercherais une autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 11
    Par défaut
    Merci pour l'aide malgré que tu ne connaisses pas l'API, c'est gentil !
    Dans les trois solutions que tu proposes je pense que la première est la plus pratique pour le moment.
    Est-ce que quelqu'un ici à déjà utilisé l'API ? Si oui comment vous avez fait pour mon 'problème' ?
    D'après mes recherches cet API est le plus utilisé pour parser du HTML non-XML comme tu le précise...
    Encore merci !

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 3

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 11
    Par défaut
    Pouvez vous développer votre message s'il vous plait ?
    Merci par avance

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 11
    Par défaut
    UP SvP

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut aide programmation
    bonjour, je me permets d'ajouter mon grain de sel dans la conversation pour vous diriger vers l'article que vient de rédiger mon frère Mimie sur mon blog : "Récupérer le détail d’une carte Magic the Gathering avec un parseur HTML" qui devrait vous être utile - En espérant avoir aidé, Greg. (lien ici : http://desgeeksetdeslettres.com/blog...n-parseur-html )

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 64
    Par défaut
    vous pouvez me dire ou vous avez trouver cette librairie pour que je puisse la telecharger?

Discussions similaires

  1. Problème avec coun(*) sur une requête
    Par Kaoru-tabris dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2007, 15h00
  2. [MySQL] Problème avec mysql_fetch_array et une requête qui ordonne(ASC)
    Par Jim_Nastiq dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/03/2007, 10h46
  3. [débutant] problème avec les nombres aléatoires
    Par happylife925 dans le forum Débuter
    Réponses: 12
    Dernier message: 10/03/2006, 15h47
  4. problème avec les nombres à virgule
    Par shingo dans le forum Langage
    Réponses: 3
    Dernier message: 16/01/2006, 18h30
  5. Problèmes avec des nombres... que faire ?
    Par sducos81 dans le forum C++
    Réponses: 6
    Dernier message: 21/07/2005, 13h46

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