[java] recuperation liens d'une page Web

karine -  
Dalida Messages postés 7114 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour !

J'ai fait un truc qui récupère les liens situés dans les balises <a href> des pages html.

Si le lien est du type <a href = "/mainlinglist.html">
Je rajoute l'url de la page courante avant pour obtenir le lien complet.

Mais là, problème !
Si l'url de la page est webby.free.fr/html/images.html par exemple, regardez dans le code source de cette page, il y a un lien /caracteres.html

Mais l'url correcte n'est pas webby.free.fr/html/images.html/caracteres.html

mais webby.free.fr/html/caracteres.html

Quest-ce que ça veut dire ? où sont les ../caracteres.html qui me permettrait de savoir qu'ils faut remonter dans l'arborescence ?

J'espère que j'ai été claire, et qu'il y aura des réponses ;-)

merci !

13 réponses

  1. jebok Messages postés 371 Date d'inscription   Statut Membre 51
     
    voici les liens relatifs et leur correspondance en lien absolu :

    "/dossier/page.html" : on revient à la racine du site

    "dossier/page.html" : on continue dans le même répertoire
    "./dossier/page.html" : on continue dans le même répertoire

    "../dossier/page.html" : on remonte d'1 niveau
    "../../dossier/page.html" : on remonte de 2 niveaux
    1
  2. karine
     
    Merci jebok !!

    Décidément, tu es incollable sur plein de trucs !

    Là j'y vois beaucoup plus clair, ah les mystères de l'informatique ! ;-)
    0
  3. jebok Messages postés 371 Date d'inscription   Statut Membre 51
     
    salut,
    en fait je viens de réaliser un aspirateur de pages web en Java donc évidemment tout ca est très frais pour moi...

    Si t'as d'autres problèmes, don't hesitate ! ;-)

    bye
    0
  4. karine
     
    Et quand tu parles de la racine du site, est-ce que c'est le host, ou est-ce que c'est le début de l'url avant un /

    Du genre www.commentcamarche.net/forum/, sa racine c'est www.commentcamarche.net

    Est-ce que ça marche à tous les coups ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. karine
     
    OK, je te fais confiance !

    Merci encore !

    A+
    0
  7. karine
     
    Je me pose encore une question ...

    Si j'ai un lien "dossier.html"
    Et une url webby.free.fr/html/images.html

    Le lien que je dois obtenir est webby.free.fr/html/dossier.html

    Mais comment faire ?
    Disons que je remonte d'un cran et que j'insere /dossier.html

    Mais si j'ai une url comme ça : webby.free.fr/html
    Je suis dans un dossier, est-ce que le résultat est webby.free.fr/html/dossier.html ou webby.free.fr/dossier.html ?

    En fait tout ça n'est pas très clair ...

    merci d'avance !
    0
    1. jebok Messages postés 371 Date d'inscription   Statut Membre 51
       
      je vais essayer de répondre à ta question. si ce n'est pas clair, n'hésite pas à me demander.

      si tu es sur la page webby.free.fr/html/images.html
      tu te trouves en réalité dans le dossier webby.free.fr/html
      Tu n'as donc pas besoin de remonter d'un cran car remonter d'un cran = remonter d'un dossier.
      Si tu veux obtenir le lien webby.free.fr/html/dossier.html
      il te suffit d'écrire :
      <a href="dossier.html"> ... <\a>



      par contre, si tu écris ca :
      <a href="../dossier.html"> ... <\a>

      Tu remontes effectivement d'un cran (et donc d'un dossier) et tu te retrouves à la page webby.free.fr/dossier.html

      J'espère avoir été clair.
      0
  8. karine
     
    C'est très clair !

    Mais techniquement, si j'ai une url, comment je détermine le dossier courant ?

    Par exemple, www.commentcamarche.net/forum/affich-1568051-[java]-recuperation-liens-d-une-page-Web#ecrire

    comment je fais pour savoir que affich-1568051-[java]-recuperation-liens-d-une-page-Web#ecrire

    est un repertoire ou non ?
    0
  9. jebok Messages postés 371 Date d'inscription   Statut Membre 51
     
    normalement une url s'écrit soit comme ca :
    http://www.site.com/repertoire/page.html
    soit comme ca :
    http://www.site.com/repertoire

    Dans le 2ème cas, le navigateur ouvre la page nommée index.html

    Remarque les pages peuvent s'appeler *.html ou *.php ou ...

    En Java, pour savoir à quel type d'url tu as affaire, utilise la méthode suivante :
    import java.net.*;
    URL lien = new URL("http://www.monsite.com/...");
    String typeMIME = lien.openConnection().getContentType();

    ca te renvoie le type MIME du fichier vers lequel pointe l'URL.
    Pour plus d'infos sur le type MIME des fichiers :
    http://www.commentcamarche.net/systemes/mime.php3
    0
  10. karine
     
    Et si le Content-Type est vide, ça veut dire que l'url se termine par un repertoire ?

    Si la réponse est oui, je crois que j'ai compris, sinon c'est pas gagné ;-)
    0
    1. jebok Messages postés 371 Date d'inscription   Statut Membre 51
       
      En fait, je viens de tester et si tu lui entres une url du type http://www.site.com/repertoire
      il renvoie le type MIME suivant : text/html

      A vrai dire je ne sais pas vraiment pourquoi...
      0
  11. jebok Messages postés 371 Date d'inscription   Statut Membre 51
     
    Et si le Content-Type est vide, ça veut dire que l'url se termine par un repertoire ?
    je vais vérifier ca...
    0
  12. jebok Messages postés 371 Date d'inscription   Statut Membre 51
     
    Si tu veux, j'ai écrit un bout de code qui transforme un lien relatif en lien absolu (j'en ai eu besoin pour mon aspirateur de pages web).
    Mais pour le faire, j'ai vraiment fait du bricolage...
    Je te laisse découvrir ça (si tu trouves quelque chose de mieux n'hésite pas !) :

    -------------------- début -----------------------
    /**
        * Méthode qui transforme un lien relatif en lien absolu
        *
        * @param str	lien relatif
        * @return		lien absolu
        */
       private String transforme(String str){
       	
       		/** on vérifie si le lien commence par http:// auquel cas
       		 * c'est un lien absolu */
       		Pattern motif1 = Pattern.compile("^http://", Pattern.CASE_INSENSITIVE);
       		Matcher moteur1 = motif1.matcher(str);
       		boolean ok1 = moteur1.find();
       	
       		/** on décompose le lien selon les slash (/)   */
       		String[] separe = lien_.toString().split("/");
       		/** longueur du tableau précédent */
       		int n = separe.length;
       		
       		/** on récupère le nom du fichier pour savoir jusqu'où remonter */
       		String chemin = lien_.getFile();
        			String[] name = chemin.split("/");
        			if (name.length < (n-2) )
        				n--;
        			else{
        				String[] separe2 = name[n-2-1].split("\\.");
        				if (separe2.length >1)
        					n--;
        			}
       		
       		/** on cherche si on doit revenir à la racine du site */
       		Pattern motifRacine = Pattern.compile("^/");
       		Matcher moteurRacine = motifRacine.matcher(str);
       		boolean okRacine = moteurRacine.find();
       	
       		/** on cherche si c'est un lien relatif introduit par: ./  */
       		Pattern motifRelatif = Pattern.compile("^\\./");
       		Matcher moteurRelatif = motifRelatif.matcher(str);
       		boolean okRelatif = moteurRelatif.find();
       		if (okRelatif) {str = str.substring(2);}
       	
       		/** on cherche si on doit remonter aux répertoires parents
       		 * (introduit par ../)  */
       		Pattern motifParent = Pattern.compile("^\\.\\./");
       		Matcher moteurParent = motifParent.matcher(str);
       		/** dans ce cas on traite le lien */
       		while (moteurParent.find()){
       			/** on enlève les 3 premiers caractères (../) */
       			str = str.substring(3);
       			/** on recommence pour voir s'il faut encore remonter 
       			 *  pour cela on modifie le moteur de recherche */
       			moteurParent = motifParent.matcher(str);
       			n--;
       		}
       	
       		/** lien absolu qui sera retourné à la fin */
       		String lienAbs;
       	
       		/** on commence à traiter le lien */
       		/** si lien est déjà absolu, on ne fait rien */
       		if (!ok1){
       			
       			/** si l'on doit revenir à la racine du site c'est simple */
       			if (okRacine) 
       				lienAbs = "http://"+lien_.getHost().toString()+str;
       			
       			/** sinon */
       			else{
       				String s="";
       				for (int i=0; i<n; i++){
       					s = s+separe[i]+"/";
       				}
       				lienAbs = s+str;	
       			}
       		}
       		/** si le lien est déjà absolu on ne le modifie pas */
       		else {lienAbs = str;}
       	
    		/** on renvoie le lien absolu */
      		return lienAbs;
       }

    -------------------- fin ------------------------
    0
  13. karine
     
    Merci beaucoup jebok !

    Je vais regarder ça en détail ...
    Si j'améliore ton code, je te l'enverrai (si j'y arrive ;-) )

    A+
    0
  14. nul de l'internet
     
    J'ai téléchargé une carte postale d'un site.Par contre,je ne sais pas comment l'insérer à mes contacts,ni ou inscrire le lien.
    0
    1. Dalida Messages postés 7114 Date d'inscription   Statut Contributeur Dernière intervention   923
       
      salut,

      commence par la charte du site, tu y trouveras des conseils pour savoir où et comment poser tes questions.

      sinon tu n'auras jamais de réponses !
      -;o)

      à plus !
      0