2009-12-17 28 views
14

我想知道是否有解析器或庫中的Java提取URL中的二級域(SLD) - 否則算法或正則表達式做相同。例如:獲取URL的二級域(java)

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

String host = uri.getHost(); 

System.out.println(host); 

它打印:

mydomain.ltd.uk 

現在我想要做的是穩健識別SLD( 「ltd.uk」)的組成部分。有任何想法嗎?

編輯:我理想地尋找一個通用解決方案,所以我會匹配「police.uk」中的「.uk」,「bbc.co.uk」中的「.co.uk」和「 .com「在」amazon.com「中。

感謝

+1

你的問題沒有很好的說明。例如,在「mydomain.ltd.uk」中,「uk」在技術上是頂級域名。 – 2009-12-17 18:57:29

+0

喬納森有一個好點。考慮重構你的問題。 – 2009-12-17 18:58:16

+0

是的 - 會做的,但呃...整個「ltd.uk」的正確名詞是什麼? – 2009-12-17 18:59:28

回答

14

不知道你的目的,但二級域名可能對你沒有多大意義。您可能需要找到public suffix,並且您正在查找的域名正下方。

Apache的HTTP組件(HttpClient的4)自帶類來處理這個,

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

你需要下載從這裏公共後綴列表,

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

+0

是的,會做很好的歡呼 – 2009-12-17 19:48:56

+0

我發現早些時候列表,但沒有打擾發佈它,因爲它不包含有限公司。英國。這仍然會做你想要的嗎? – danben 2009-12-17 20:35:33

+0

@danben:是的,我必須添加ltd.uk(我只是通過舉例的方式)。基本上這個解決方案歸結爲使用列表,這似乎相當全面。我標記爲包含解析器的這個答案是正確的。 – 2009-12-17 20:47:33

-1

如果你想在二級域名,可以拆分的字符串「」並拿走最後兩部分。當然,這假設你總是有一個不特定於該網站的二級域名(因爲它聽起來就是你想要的)。

+0

不幸的是,這是一個普遍的問題 - 所以我需要匹配.com,.co.uk,.uk(例如在police.uk中)等 – 2009-12-17 19:05:48

+0

在這種情況下,您可以嘗試從此列表中構建一個哈希值 - https ://wiki.mozilla.org/TLD_List,然後檢查最後兩部分以進行二級域名匹配,否則將最後一部分作爲頂級域名。 – danben 2009-12-17 19:09:34

+0

是的,我不認爲有一個程序化的解決方案,這超越建立一個大名單,以匹配 – 2009-12-17 19:16:45

0

我沒有你的具體案例的答案 - 喬納森的評論指出,你應該可能重構你的問題。

不過,我建議看看Restlet項目的Reference類。它有很多有用的方法。而且由於Restlet是開源的,你不必使用整個庫 - 你可以下載源代碼並且只添加一個類到你的項目中。

1
  1. 提到的名單+閱讀維基百科更新給出了98%正確的TLD清單
  2. 自己通過http://www.iana.org/domains/root/db/,並點擊每個網站,看到最新消息爲您提供了另外2%(例如.com.aq和.gov.an)
  3. 不幸的是,大型「免費網站空間」提供商是另一種考慮因素,例如,無數* .blogspot.com域名,如果您下載alexa top 100.000(免費csv文件),您至少可以很好地瞭解這些域名中最常用的域名,這些域名應該可以爲您提供一定比例的域名(例如,當比較alexa評分與stumbleupon瀏覽量與美味的書籤)(alexa有時只需要頂級域名,而美味真的md5的每一個網址,所以1 alexa - >多個美味md5哈希
  4. 除了有時在Twitter的情況下,之後/也是重要的,如果你正在尋找唯一性評分的東西。

這裏是Alexa排名前40位的列表。000,當真正的頂級域名被篩選出來給你一個感覺:(這意味着Alexa不會統計域名爲以下):

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---thesartorialist。 blogspot.com---analytics.blogspot.com---ss.iij4u.or.jp/~ceh2---67.220.92.23---gmailblog.blogspot.com---183.99.121.86---vgorode.ru /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 /〜克里斯汀--- 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 ---同人,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---nonews-news.blogspot.com---testosterona.blog.br---nn.iij4u.or.jp/~has---cs.tut.fi/~jkorpela---youtube.com/用戶/ oldspice --- 67.159.53.25---taxalia.blogspot.com---208.98.30.70---filmesporno.blog.br---alles-schallundrauch.blogspot.com---vatera.hu/user/ account---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---erogamescape.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 ---乘法。COM /用戶/加盟--- programseo.blogspot.com---collectivebias.ning.com---bablorub.blogspot.com---thinkexist.com/user/personalAccount---us.my.alibaba.com/用戶/標誌--- 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麥當娜。 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/---〜梓naruto-spoilers.blogspot.com---205.209.140.195---193.227.20.21---adsenseforfeeds.blogspot.com---group.ameba.jp/user/團體---

2

選擇的答案是最好的辦法。這對於那些你不想代碼時,這裏是如何我都做到了。

首先,我不明白,要麼org.apache.http.impl.cookie.PublicSuffixFilter,或者是有錯誤在裏面。

基本上,如果你在google.com傳遞正確返回false。如果您在google.com.au傳遞不正確,則返回true。該缺陷是在代碼闕應用模式,如* .AU。

這是基於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 ""; 
    } 
} 

而且,解析器。我給它改名。

/** 
* 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); 
    } 
} 

最後,如何使用它

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

尋找這些問題的答案,而不是被他們滿意後,我用類com.google.common.net.InternetDomainName從所有部件中減去域名的公共部分:

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; 
} 

這個類是行家的番石榴庫:

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

這個內部類是使用TldPatterns.class這是包私有,有烤到它的頂級域名的列表。

有趣的是,如果您在下面的鏈接中查看這些類的源代碼,它會明確列出「police.uk」作爲私有域名。這是正確的,因爲police.uk是警方控制的私人域名。否則criminals.police.uk將會寄給您關於他們正在進行調查信用卡欺詐,要求您提供信用卡詳細信息)從simbo1905貢獻

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

0

1.

方法nonePublicDomainParts應予糾正

input: "com.abc.com.ac"

:因爲TLD包含".",例如"com.ac"

正確的輸出是"com.abc"

要獲得SLD,您可以使用方法publicSuffix()從給定域中刪除TLD

2.

一組不應該因爲包含相同的部分結構域的使用,例如:

input: part1.part2.part1.TLD

output: part1, part2

正確的輸出是:part1, part2, part1或在表格part1.part2.part1

因此,而不是Set<String>使用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; 
} 

只要給域,U將得到的頂級域名。從http://code.google.com/p/guava-libraries/

0

Dnspy 下載jar文件是另一種更靈活的替代publicsuffix庫。