2009-12-17 16 views
14

Zastanawiam się, czy istnieje parser lub biblioteka w języku Java do wyodrębniania domeny drugiego poziomu (SLD) w adresie URL - lub w przypadku braku algo lub wyrażenia regularnego do robienia tego samego . Na przykład:Zdobądź domenę drugiego poziomu adresu URL (java)

URI uri = new URI("http://www.mydomain.ltd.uk/blah/some/page.html"); 

String host = uri.getHost(); 

System.out.println(host); 

która drukuje:

mydomain.ltd.uk 

Teraz to, co chciałbym zrobić to solidnie zidentyfikować ("ltd.uk") komponent SLD. Jakieś pomysły?

Edit: mam idealnie szuka rozwiązania ogólnego, tak by dopasować „.uk” w «Policji Okręgowej», „.pl” w «bbc.co.uk» i " .com "w" amazon.com ".

Dzięki

+1

Twoje pytanie nie jest dobrze określone. Na przykład w "mydomain.ltd.uk", "uk" jest technicznie domeną najwyższego poziomu. –

+0

Jonathan ma dobry punkt. Rozważ zreorganizowanie swojego pytania. –

+0

tak - zrobi, ale umm ... jaki jest prawidłowy termin dla całego "ltd.uk"? –

Odpowiedz

14

Nie znasz swojego celu, ale Domena drugiego poziomu może nie mieć dla ciebie większego znaczenia. Prawdopodobnie musisz znaleźć numer public suffix, a domena znajdująca się pod nim jest tym, czego szukasz.

Apache Składnik (HttpClient 4) pochodzi z klasy do obsługi tego,

org.apache.http.impl.cookie.PublicSuffixFilter 
org.apache.http.impl.cookie.PublicSuffixListParser 

Należy pobrać listę sufiksów publicznego stąd,

http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

+0

tak, że zrobi to przyjemnie. –

+0

Znalazłem tę listę wcześniej, ale nie zawracałem sobie głowy jej publikowaniem, ponieważ nie zawiera ona ltd. uk. Czy to nadal będzie robić, co chcesz? – danben

+0

@danben: tak, będę musiał dodać ltd.uk (którego używałem tylko jako przykład). Zasadniczo to rozwiązanie sprowadza się do korzystania z listy i wydaje się to dość wyczerpujące. Poprawiłem tę odpowiedź za uwzględnienie parsera. –

-1

Jeśli chcesz domeny drugiego poziomu, można podzielić ciąg na „”. i weź dwie ostatnie części. Oczywiście zakłada to, że zawsze masz domenę drugiego poziomu, która nie jest specyficzna dla witryny (ponieważ brzmi tak, jak tego chcesz).

+0

Niestety, jest to ogólny problem - więc muszę dopasować .com, .co.uk, .uk (np. Jak w police.uk) itd. –

+0

W takim przypadku możesz spróbować zbudować ahash z tej listy - https : //wiki.mozilla.org/TLD_List, a następnie sprawdź ostatnie dwie części dla dopasowania domeny drugiego poziomu, w przeciwnym razie ostatnią część jako TLD. – danben

+0

tak, nie sądzę, że istnieje programowe rozwiązanie tego problemu, poza budowaniem dużej listy, która pasowałaby do –

0

Nie mam odpowiedzi na konkretny przypadek - a komentarz Jonathana wskazuje, że prawdopodobnie powinieneś zastanowić się nad swoim pytaniem.

Mimo to proponuję rzucić okiem na klasę Reference projektu Restlet. Ma mnóstwo użytecznych metod. A ponieważ Restlet to Open Source, nie musiałbyś używać całej biblioteki - możesz pobrać źródło i dodać tylko jedną klasę do swojego projektu.

1
  1. wspomniana lista + czytanie aktualizacji wikipedii daje 98% poprawnej listy TLD
  2. przejście przez http://www.iana.org/domains/root/db/ i kliknij każde nic, a zobaczysz najnowsze wiadomości, które dają inne 2% (np. .com.aq i .gov.an)
  3. Niestety, inni dostawcy "darmowej przestrzeni internetowej" to kolejna rzecz, którą należy wziąć pod uwagę, np. niezliczone domeny * .blogspot.com, jeśli pobrałeś alexę w górę 100 000 (darmowy plik csv), możesz przynajmniej uzyskać dobry przegląd najczęściej używanych, które powinny Ci zapewnić pewien procent procentowy dla tych domen (np. porównywanie ocen alexa ze stumbleuponowymi odsłonami z pysznymi zakładkami) (alexa czasami zajmuje tylko najwyższą domenę, a przy tym pyszny URL każdego md5, więc 1 alexa -> wiele pysznych mash5 mash5
  4. oprócz tego, że czasami w przypadku Twittera, to co idzie po znaku/ma również znaczenie, jeśli szukasz wyjątkowości, aby coś ocenić.

Oto lista 40 najlepszych Alexa.000, gdy prawdziwe TLD zostaną odfiltrowane, aby dać ci odczucie: (co oznacza, że ​​Alexa NIE liczy się razem dla domeny dla następnych):

bp.blogspot.com --- espn.go.com- --files.wordpress.com --- abcnews.go.com --- disney.go.com --- troktiko.blogspot.com --- en.wordpress.com --- api.ning.com --- abc.go.com---220.181.38.82---213.174.154.20---abclocal.go.com---feedproxy.google.com/~r---forums.wordpress.com---googleblog.blogspot .com --- 1.cnm999.com/user/10008---213.174.143.196---92.42.51.201---googlewebmastercentral.blogspot.com---myespn.go.com---213.174.143.197-- -61.132.221.146---support.wordpress.com---dashboard.wordpress.com---sethgodin.typepad.com---paygo.17zhifu.com/user/10005---go2.wordpress.com-- -1.1.1.1 --- movies.go.com --- home.comcast.net --- googlesystem.blogspot.com --- abcfamily.go.com --- home.spaces.live.com --- 196.1 .237.210 --- kaixin001.com/~record---xhamster.com /user/video---gold-oil-commodity.blogspot.com---journeyplanner.tfl.gov.uk/user/XSLT_TRIP_REQUEST2---206.108.48.238---blog.wordpress.com---67.220.92.21 - 183.101.80.130---211.94.190.80---youtube-global.blogspot.com---uta-net.com/user/phplib---cinema3satu.blogspot.com---119.147.41.16-- -sites.google.com/site/sites---kk.iij4u.or.jp/~dyo---220.181.6.19---toontown.go.com---signup.wordpress.com---hessessorialist. blogspot.com---analytics.blogspot.com---ss.iij4u.or.jp/~ceh2---67.220.92.23---gmailblog.blogspot.com---183.99.121.86---gorugator.pl /user/create---61.132.216.243---217.175.53.72---labnol.blogspot.com---adsense.blogspot.com---subscribe.wordpress.com---fimotro.blogspot.com-- -creators.ning.com---sarkari-naukri.blogspot.com---search.wordpress.com---orange-hiyoko.blogspot.com---cashewmaniakpop.wordpress.com---pixiehollow.go.com ---adwords.blogspot.com---202.53.226.102---lorelle.wordpress.com---homestead.com/~site---multiply.com/user/signout---221.231.148.249--- 183.101.80.77 --- windowsliveintro. spaces.live.com---124.228.254.234---streaming-web.blogspot.com---id.tianya.cn/user/message---familyfun.go.com---tro-ma-ktiko. blogspot.com---about.ning.com---paygo.17zhifu.com/user/10020---tututina.blogspot.com---toolserver.org/~geohack---superjob.ru/user/resume ---ejobs.ro/user/locuri-de-munca---gnula.blogspot.com---alles.or.jp/~uir---chiark.greenend.org.uk/~sgtatham---woork .blogspot.com --- 88.208.32.218---webstreamingmania.blogspot.com---spaces.live.com---youtube.com/user/RayWilliamJohnson---cloob.com/user/login---asstr .org/~ Kristen --- getclicky.com/user/login---guesshermuff.blogspot.com---211.98.70.195---222.73.105.196---pp.iij4u.or.jp/~taakii-- -unsoloclic.blogspot.com---photoshopdisasters.blogspot.com---218.83.161.253---217.16.18.163---217.16.18.207---217.16.28.104---222.73.105.210---youtube.com /user/OldSpice---hubpages.com/user/new---pelisdvdripdd.blogspot.com---95.143.193.60---es.wordpress.com---217.16.18.206---61.147.116.146-- -damncoolpics.blogspot.com --- family.go.com --- 81.176.235.1 62---gutteruncensorednewsr.blogspot.com---terselubung.blogspot.com---faisalardhy.blogspot.com---67.220.92.14---goodreads.com/user/show---116.228.55.34--- profile.typepad.com---kaixin001.com/~truth---linkbuildersassociated.ning.com---nicotto.jp/user/mypage---ritemail.blogspot.com---hyperboleandahalf.blogspot.com-- -carscoop.blogspot.com---tubemogul.com/user/dash---press-gr.blogspot.com---81.176.235.164---soapnet.go.com---208.98.30.69---trelokouneli .blogspot.com --- help.ning.com---id.tianya.cn/user/register---slovari.yandex.ru/~%D0%BA%D0%BD%D0%B8%D0%B3 % D0% B8 --- printable-coupons.blogspot.com --- unic77.blogspot.com --- globaleconomicanalysis.blogspot.com --- 183.101.80.68 --- 221.194.33.60 --- doujin-games88.blogspot .com --- magaseek.com/user/SearchProducts---files.posterous.com---wwwnew.splinder.com---kolom-tutorial.blogspot.com---strobist.blogspot.com---67.21 .91.73 --- needanarticle.com/user/activity---forum.moe.gov.om/~moeoman---milasdaydreams.blogspot.com---88.208.17.189---67.220.92.22---115.238. 100,2 11---news-news.blogspot.com---testosterona.blog.br---nn.iij4u.or.jp/~has---cs.tut.fi/~jkorpela---youtube.com/ user/oldspice --- 67.159.53.25---taxalia.blogspot.com---208.98.30.70---filmesporno.blog.br---alles-schallundrauch.blogspot.com---vatera.hu/user/ konto :-78.140.136.182---us.my.alibaba.com/user/join---stores.homestead.com---pes2008editing.blogspot.com---ocn.ne.jp/~matrix-- -adweek.blogs.com---115.238.55.94---markjaquith.wordpress.com---k3.dion.ne.jp/~dreamlov---38.99.186.222---film.tv.it--- android-developers.blogspot.com---217.218.110.147---kadokado.com/user/login---bollyvideolinks4u.blogspot.com---sookyeong.wordpress.com---87.101.230.11---livecodes. blogspot.com---67.220.91.19---homepage2.nifty.com/bustered--pp.iij4u.or.jp/~manga100---110.173.49.202---ogamecape.dyndns.org/~ap2- --cs.berkeley.edu/~lorch---cakewrecks.blogspot.com---59.106.117.185---119.75.213.61---id.wordpress.com---de.wordpress.com---telefilmdblink .blogspot.com --- 61.139.105.138 --- pomnóż.com/user/join --- programseo.blogspot.com---collectivebias.ning.com---bablorub.blogspot.com---thinkexist.com/user/personalAccount---us.my.alibaba.com/ user/znak --- 66.70.56.90---getsarkari-naukri.blogspot.com---59.106.117.183---productreviewplace.ning.com---support.weebly.com---kaixin001.com/~lucky ---football-russia.blogspot.com---magaseek.com/user/ItemDetail---polprav.blogspot.com---atlasshrugs2000.typepad.com---jpn-manga.blogspot.com---88.208 .32.219 --- google-latlong.blogspot.com---59.106.117.188---erogamescape.ddo.jp/~ap2---218.87.32.245---watchhorrormovies.blogspot.com---sarotiko.blogspot. com---googlewebmastercentral-de.blogspot.com---colmeia.blog.br---us.my.alibaba.com/user/webatm---220.170.79.109---darkville.blogspot.com--- youtube.com/user/PiMPDailyDose---disneymovierewards.go.com---fukuoka.lg.jp---61.147.115.16---iisc.ernet.in---youtube.com/user/HuskyStarcraft--- 202.108.212.211---homepage3.nifty.com/otakarando---94.77.215.37---pitchit.ning.com---59.106.117.186---thestar.blogs.com---1 .254.254.254 --- piratesonline.go.com---animedblink.blogspot.com---137.32.44.152---eurus.dti.ne.jp/~yoneyama---state.la.us--- lastminute.is.it---bangpai.taobao.com/user/groups---csse.monash.edu.au/~jwb---jquery-howto.blogspot.com---sakura.ne.jp/~ moesino---users.skynet.be/mgueury---saitama.lg.jp---portaldasfinancas.gov.pt---bnonline.fi.cr---135.125.60.11---zhuhai.gd.cn- --kuna.net.kw---59.175.213.77---58.218.199.7---multiply.com/user/signin---youtube.com/user/HDstarcraft---blinklist.com/user/join- --us.my.alibaba.com/user/company---jptwitterhelp.blogspot.com---67.220.92.017---88.208.17.51---youtube.com/user/GoogleWebmasterHelp---208.53.156.229- --filmdblink.blogspot.com---blinklist.com/user/signup---3arbtop.blogspot.com---attivissimo.blogspot.com---onlinemovie12.blogspot.com---98.126.189.86--- mytvsource.blogspot.com---blinklist.com/user/login---googlejapan.blogspot.com---76.73.65.166---gutteruncensorednewsb.blogspot.com---issuu.com/user/upload--- 86.51.174.18---88.208.17.120---profile.china.al ibaba.com/user/admin---jntuworldportal.blogspot.com---sz.js.cn---disneymovieclub.go.com---a1.com.mk---dd.iij4u.or.jp/ ~ --- rr.iij4u.or.jp/~plasma---mlmlaunchformula.ning.com---112.78.7.151---blogdelatele.blogspot.com---googlemobile.blogspot.com---78.109 Madonna. 199.240---wsu.edu/~brians---internapoli-city.blogspot.com---hh.iij4u.or.jp/~dmt---kaixin001.com/~house---61.155.11.14-- -youtube.com/user/SHAYTARDS---turbobit.net/user/files---qjy168.com/user/do---hubpages.com/user/finished---upload2.dyndns.org---f32 .aaa.livedoor.jp/--- ~ Azusa naruto-spoilers.blogspot.com---205.209.140.195---193.227.20.21---adsenseforfeeds.blogspot.com---group.ameba.jp/user/ grupy ---

2

wybrana odpowiedź jest najlepszym rozwiązaniem. Że dla tych z was nie chce go zakodować, tutaj jest, jak mam to zrobić.

Po pierwsze, nie rozumiem albo org.apache.http.impl.cookie.PublicSuffixFilter, czy jest to błąd w nim.

Zasadniczo, jeśli przechodzą w google.com poprawnie zwraca false. Jeśli przechodzą w Google.com.au niepoprawnie zwraca prawda. Błąd jest w que Kodeks stosuje wzory, np * .au.

Oto sprawdzania kodu na podstawie org.apache.http.impl.cookie.PublicSuffixFilter:

public class TopLevelDomainChecker { 
    private Set<String> exceptions; 
    private Set<String> suffixes; 

    public void setPublicSuffixes(Collection<String> suffixes) { 
     this.suffixes = new HashSet<String>(suffixes); 
    } 
    public void setExceptions(Collection<String> exceptions) { 
     this.exceptions = new HashSet<String>(exceptions); 
    } 

    /** 
    * Checks if the domain is a TLD. 
    * @param domain 
    * @return 
    */ 
    public boolean isTLD(String domain) { 
     if (domain.startsWith(".")) 
      domain = domain.substring(1); 

     // An exception rule takes priority over any other matching rule. 
     // Exceptions are ones that are not a TLD, but would match a pattern rule 
     // e.g. bl.uk is not a TLD, but the rule *.uk means it is. Hence there is an exception rule 
     // stating that bl.uk is not a TLD. 
     if (this.exceptions != null && this.exceptions.contains(domain)) 
      return false; 


     if (this.suffixes == null) 
      return false; 

     if (this.suffixes.contains(domain)) 
      return true; 

     // Try patterns. ie *.jp means that boo.jp is a TLD 
     int nextdot = domain.indexOf('.'); 
     if (nextdot == -1) 
      return false; 
     domain = "*" + domain.substring(nextdot); 
     if (this.suffixes.contains(domain)) 
      return true; 

     return false; 
    } 


    public String extractSLD(String domain) 
    { 
     String last = domain; 
     boolean anySLD = false; 
     do 
     { 
      if (isTLD(domain)) 
      { 
       if (anySLD) 
        return last; 
       else 
        return ""; 
      } 
      anySLD = true; 
      last = domain; 
      int nextDot = domain.indexOf("."); 
      if (nextDot == -1) 
       return ""; 
      domain = domain.substring(nextDot+1); 
     } while (domain.length() > 0); 
     return ""; 
    } 
} 

I parser. I przemianowany go.

/** 
* Parses the list from <a href="http://publicsuffix.org/">publicsuffix.org 
* Copied from http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/cookie/PublicSuffixListParser.java 
*/ 
public class TopLevelDomainParser { 
    private static final int MAX_LINE_LEN = 256; 
    private final TopLevelDomainChecker filter; 

    TopLevelDomainParser(TopLevelDomainChecker filter) { 
     this.filter = filter; 
    } 
    public void parse(Reader list) throws IOException { 
     Collection<String> rules = new ArrayList(); 
     Collection<String> exceptions = new ArrayList(); 
     BufferedReader r = new BufferedReader(list); 
     StringBuilder sb = new StringBuilder(256); 
     boolean more = true; 
     while (more) { 
      more = readLine(r, sb); 
      String line = sb.toString(); 
      if (line.length() == 0) continue; 
      if (line.startsWith("//")) continue; //entire lines can also be commented using // 
      if (line.startsWith(".")) line = line.substring(1); // A leading dot is optional 
      // An exclamation mark (!) at the start of a rule marks an exception to a previous wildcard rule 
      boolean isException = line.startsWith("!"); 
      if (isException) line = line.substring(1); 

      if (isException) { 
       exceptions.add(line); 
      } else { 
       rules.add(line); 
      } 
     } 

     filter.setPublicSuffixes(rules); 
     filter.setExceptions(exceptions); 
    } 
    private boolean readLine(Reader r, StringBuilder sb) throws IOException { 
     sb.setLength(0); 
     int b; 
     boolean hitWhitespace = false; 
     while ((b = r.read()) != -1) { 
      char c = (char) b; 
      if (c == '\n') break; 
      // Each line is only read up to the first whitespace 
      if (Character.isWhitespace(c)) hitWhitespace = true; 
      if (!hitWhitespace) sb.append(c); 
      if (sb.length() > MAX_LINE_LEN) throw new IOException("Line too long"); // prevent excess memory usage 
     } 
     return (b != -1); 
    } 
} 

I wreszcie, jak go używać

FileReader fr = new FileReader("effective_tld_names.dat.txt"); 
    TopLevelDomainChecker checker = new TopLevelDomainChecker(); 
    TopLevelDomainParser parser = new TopLevelDomainParser(checker); 
    parser.parse(fr); 
    boolean result; 
    result = checker.isTLD("com"); // true 
    result = checker.isTLD("com.au"); // true 
    result = checker.isTLD("ltd.uk"); // true 
    result = checker.isTLD("google.com"); // false 
    result = checker.isTLD("google.com.au"); // false 
    result = checker.isTLD("metro.tokyo.jp"); // false 
    String sld; 
    sld = checker.extractSLD("com"); // "" 
    sld = checker.extractSLD("com.au"); // "" 
    sld = checker.extractSLD("google.com"); // "google.com" 
    sld = checker.extractSLD("google.com.au"); // "google.com.au" 
    sld = checker.extractSLD("www.google.com.au"); // "google.com.au" 
    sld = checker.extractSLD("www.google.com"); // "google.com" 
    sld = checker.extractSLD("foo.bar.hokkaido.jp"); // "foo.bar.hokkaido.jp" 
    sld = checker.extractSLD("moo.foo.bar.hokkaido.jp"); // "foo.bar.hokkaido.jp" 
10

Po obejrzeniu tych odpowiedzi i nie jest spełniony przez nich użyłem klasy com.google.common.net.InternetDomainName odjąć części publicznych nazwy domeny ze wszystkich części:

Set<String> nonePublicDomainParts(String uriHost) { 
    InternetDomainName fullDomainName = InternetDomainName.from(uriHost); 
    InternetDomainName publicDomainName = fullDomainName.publicSuffix(); 
    Set<String> nonePublicParts = new HashSet<String>(fullDomainName.parts()); 
    nonePublicParts.removeAll(publicDomainName.parts()); 
    return nonePublicParts; 
} 

że klasa jest na Maven w guawa biblioteka:

<dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>10.0.1</version> 
     <scope>compile</scope> 
    </dependency> 

Wewnętrznie ta klasa jest za pomocą TldPatterns.class która jest pakiet prywatne i posiada listę najpopularniejszych domen najwyższego poziomu pieczone do niego.

Co ciekawe, jeśli spojrzysz na to źródło klas pod linkiem poniżej, zostanie jawnie wpisana "policja.uk" jako nazwa domeny prywatnej. Jest to prawdą, ponieważ policja.uk jest prywatną domeną kontrolowaną przez policję; inny criminals.police.uk będzie wysyłając pytasz o podanie danych karty kredytowej w odniesieniu do toczących się śledztw nadużyć kart;)

http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/net/TldPatterns.java?spec=svn8c3cc7e67132f8dcaae4bd214736a8ddf6611769&r=8c3cc7e67132f8dcaae4bd214736a8ddf6611769

0

1.

Metoda nonePublicDomainParts z simbo1905 wkładu należy skorygować względu termoluminescencyjnej, który zawiera "." np "com.ac":

input: "com.abc.com.ac"

output: "abc"

prawidłowe wyjście to "com.abc".

Aby uzyskać SLD można wyciąć TLD z określonej domeny przy użyciu metody publicSuffix().

2.

Zestaw nie powinny być stosowane, ponieważ w obszarach, które zawierają takie same elementy, na przykład:

input: part1.part2.part1.TLD

output: part1, part2

prawidłowe wyjściowy: part1, part2, part1 lub w formularz part1.part2.part1

Tak więc zamiast Set<String> użyj List<String>.

0
public static String getTopLevelDomain(String uri) { 

InternetDomainName fullDomainName = InternetDomainName.from(uri); 
InternetDomainName publicDomainName = fullDomainName.topPrivateDomain(); 
String topDomain = ""; 

Iterator<String> it = publicDomainName.parts().iterator(); 
while(it.hasNext()){ 
    String part = it.next(); 
    if(!topDomain.isEmpty())topDomain += "."; 
    topDomain += part; 
} 
return topDomain; 
} 

Dajcie domenę, a u dostanie domeny najwyższego poziomu. Pobierz plik JAR z http://code.google.com/p/guava-libraries/

0

Dnspy to kolejna bardziej elastyczna alternatywa dla biblioteki publicsuffix.

Powiązane problemy