JAVA - Récupérer les liens d'une page web

Bonjour,

Je doit récupérer tous les liens d’une page web (annuaire google : http://www.google.fr/dirhp?hl=fr&tab=wd&q=)), mais je ne récupère pas tout, le dernier lien récupéré est “Achat”.

J’ai essayé sur d’autres sites, je ne récupère pas plus de 10 liens. J’ai fouiller dans la java doc mais je n’ai rien trouvé sur une quelconque initialisation.

Mon code :



Vector getTagAttributeValue(HTML.Tag unTag, String unAttribut)
   {
  System.out.println("[looking for TAG]:" + unTag);
     Vector result = new Vector();
     HTMLDocument.Iterator HI = htmlDoc.getIterator(unTag);
     int x=HI.getAttributes().getAttributeCount();
     System.out.println("------------------------------->" + x);
     for(; (HI!=null) && HI.isValid(); HI.next())
     {
      x=HI.getAttributes().getAttributeCount();
      System.out.println("------------------------------->" + x);
       System.out.println("[found TAG]: " + HI.getStartOffset() + "->" + HI.getEndOffset());
       AttributeSet AS = HI.getAttributes();
       for( Enumeration e = AS.getAttributeNames(); e.hasMoreElements(); ) 
       {
         HTML.Attribute HA = (HTML.Attribute)e.nextElement();
         System.out.println("[HTML.Attribute]    :"+HA);        
         System.out.println("[AttributeSet.Value]:"+AS.getAttribute(HA));
         if ( unAttribut.equals("") || unAttribut.equals(HA.toString()) )
           result.addElement(AS.getAttribute(HA).toString());
       }           
     }
    return result;
   }


merci d’avance.

Si d’autres algorithme plus simple sont disponibles, je suis preneur, merci.

Bonjour,
je n’ai jamais utilisé la classe HTML, mais j’ai vu 2-3 détails pour ton code: est-ce que c’est normal que tu teste ça?

Sinon, ta classe est une classe Swing, tu peux aussi le parser en SAX, en implémentant une classe org.xml.sax.ContentHandler, (ou aussi une implémentation:DefaultHandler) tu récupère les évènement “startElement” sur chaque tag, et là, tu peux tester de la même manière si c’est un tag “A”, et récupérer l’attribut “href”.

Tu passe ensuite cette classe à un xmlReader que tu obtient par:
XMLReaderFactory.createXMLReader().
:slight_smile:

Petite remarque sur les normes Java :wink:
Il ne faut pas renvoyer un Vector, mais plutôt son interface List, ce qui permet d’être plus libre sur l’implementation de List que tu renvoie, et la class ArrayList est préférable à la classe Vector.
Et il ne faut pas nommer les variables en majuscules, le tout majuscule est réservé aux constantes, et commencer par une majuscule pour les classes uniquement.
Ce sont les normes utilisées pour toutes les classes sun, et comme ça, le code est plus hommogène.

Désolé pour le code qui est sale, je connais les normes et m’en excuse encore (codage dans l’énervement!!!).

Les tests sont ce dont j’ai besoin ils sont utiles.

je test et je répond.

(je déconseillerai Sax pour des documents HTML, surtout vu la façon dont ils sont écrits)

(Ah oui pas faux merci).
En fait il faut être sûr que ton HTML est conforme au XML, donc avec toutes les balises fermées…<br/> et pas <br> etc. m’enfin SAX est tellement basique que ça se tente quand même. (il ne faut pas chercher à charger le DOM par contre).
Sinon, même le parsing swing n’est pas forcément sûr??

Enfin, une bête recherche texte serait suffisante pour retrouver des liens href… (mais pas propre bien sûr)

L’inconvénient avec cette façon de faire c’est qu’il faut redéfinir les méthodes de java (startElement(…)) ce qui surcharge le code, y’a pas des fonctions java qui se trouve sur une couche supérieure qui appelleraient implicitement les fonctions startElement() et le reste pour retourner un ensemble de données.


List getTagAttributeValue(HTML.Tag unTag, String unAttribut)throws MalformedURLException,IOException
   {
//   Convert urlString into a BufferedReader
      URL               url        = new URL(urlString);
      URLConnection     connection = url.openConnection();
      InputStream       is         = connection.getInputStream();
      InputStreamReader isr        = new InputStreamReader(is);
      BufferedReader    br         = new BufferedReader(isr);
      // Create empty HTMLDocument to read into
      HTMLEditorKit htmlKit = new HTMLEditorKit();
      htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument();
      // Create parser (javax.swing.text.html.parser.ParserDelegator)
      HTMLEditorKit.Parser parser = new ParserDelegator();
      // Get parser callback from document
      HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
      // Load it (true means to ignore character set)
      parser.parse(br, callback, true);
      htmlDoc.setBase(url);
      
  System.out.println("[looking for TAG]:" + unTag);
  ArrayList result = new ArrayList();
     HTMLDocument.Iterator htmlIT = htmlDoc.getIterator(unTag);
     for(; (htmlIT!=null) && htmlIT.isValid(); htmlIT.next())
     {
       System.out.println("[found TAG]: " + htmlIT.getStartOffset() + "->" + htmlIT.getEndOffset());
       AttributeSet attrSet = htmlIT.getAttributes();
       for( Enumeration e = attrSet.getAttributeNames(); e.hasMoreElements(); ) 
       {
         HTML.Attribute htmlAttr = (HTML.Attribute)e.nextElement();
         System.out.println("[HTML.Attribute]    :"+htmlAttr);        
         System.out.println("[AttributeSet.Value]:"+attrSet.getAttribute(htmlAttr));
         if ( unAttribut.equals("") || unAttribut.equals(htmlAttr.toString()) )
           result.add(attrSet.getAttribute(htmlAttr).toString());
       }           
     }
    return result;
   }

J’ai rajouter les inits, parse et autre. C’est peut-être la dedans que j’ai fait une erreur ???

Une recherche texte donc :slight_smile: avec une regexp, ça se fait vite fait.

J’ai trouver la réponse à mes problèmes dans un autre code sur http://www.nicolas-guillard.com/enseigneme…java/etape4.htm

merci de vos orientations qui m’ont bien servi.
Bonne journée à tous