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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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 !

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