Avatar billede zypher212 Nybegynder
02. maj 2007 - 01:20 Der er 5 kommentarer og
1 løsning

Få den absolutte path fra en url.

Jeg er ved at lave en crawler, og mangler en metode til at finde den absolutte path fra en url. Eks:

URL url = new URL("http://aau.dk/someDir/../");

Det er nemt at indse at "http://aau.dk/someDir/../" er == "http://aau.dk/". Da jeg har brug for at sammenligne urls, så jeg ikke besøger samme site flere gange, vil jeg høre om der er en metode til at finde den absolutte path med.
På forhånd tak.
Avatar billede arne_v Ekspert
02. maj 2007 - 01:52 #1
Jeg kender ikke nogen indbygget klasse til det, men hvis du splitter URL i dele
og så splitter path ved / og skipper . og skipper både .. og den foregående
og så samler path igen og laver ny URL, så bør det vel virke ?
Avatar billede arne_v Ekspert
02. maj 2007 - 02:03 #2
noget a la:

    private static URL urlNormalize(URL u) throws MalformedURLException {
        String prot = u.getProtocol();
        String host = u.getHost();
        String path = u.getPath();
        String[] pp = path.split("/");
        String newpath = "";
        int ix = pp.length - 1;
        while(ix >= 0) {
            if(pp[ix].equals(".")) {
                // skip
            } else if(pp[ix].equals("..")) {
                ix--; // skip this and previous
            } else {
                newpath = pp[ix] + (newpath.length() > 0 ? "/" : "") +newpath; // use
            }
            ix--;
        }
        return new URL(prot, host, newpath);
    }
Avatar billede arne_v Ekspert
02. maj 2007 - 02:03 #3
Den skal vist udbygges for at understøtte port og query parametre, men ...
Avatar billede zypher212 Nybegynder
02. maj 2007 - 20:31 #4
Ja det skal netop udbygges, og derfor spørger jeg efter noget der er lavet af prof. folk, der har taget højde for alle de væsentligste ting. :)

Jeg har allerede lavet noget lignende det du foreslår.

Faldt over løsningen nu her:

URI uri = URI("http://aau.dk/someDir/../");
uri = uri.normalize();
URL url = uri.toURL();

System.out.println(url.getPath());

Hvilket var exact hvad jeg ledte efter.

Da du har lavet en løsning tilfalde points dig, så smid et svar.
Avatar billede arne_v Ekspert
03. maj 2007 - 04:05 #5
Den lettere forbedrede udgave:

    private static URL urlNormalize(URL u) throws MalformedURLException {
        String prot = u.getProtocol();
        String host = u.getHost();
        int port = u.getPort();
        String path = u.getPath();
        String query = u.getQuery();
        String[] pp = path.split("/");
        String newpath = "";
        int ix = pp.length - 1;
        while(ix >= 0) {
            if(pp[ix].equals(".")) {
                // skip
            } else if(pp[ix].equals("..")) {
                ix--; // skip this and previous
            } else {
                newpath = pp[ix] + (newpath.length() > 0 ? "/" : "") +newpath; // use
            }
            ix--;
        }
        return new URL(prot, host, port, newpath + (query != null ? "?" + query : ""));
    }
Avatar billede arne_v Ekspert
03. maj 2007 - 04:05 #6
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester