[java] recuperation liens d'une page Web

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. 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
    1. 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
      1. 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
        1. 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
        2. OK, je te fais confiance !

          Merci encore !

          A+
          0
          1. 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. 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
          2. 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
            1. 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
              1. 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. 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
              2. Et si le Content-Type est vide, ça veut dire que l'url se termine par un repertoire ?
                je vais vérifier ca...
                0
                1. 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
                  1. 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
                    1. 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. Contributeur
                        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