V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bigzhu
V2EX  ›  问与答

如何根据 url 准确取出 domain?

  •  
  •   bigzhu · 2017-07-01 11:57:10 +08:00 · 4723 次点击
    这是一个创建于 2728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看似很简单的问题, 但是单用程序貌似搞不定哦.

    比如有个 url 是这样 https://www.google.com.sg/?gfe_rd=cr&ei=DhtXWc6FJ4Pj8wfH6pjQBw#newwindow=1&q=bigzhu

    我要取出 domain, 也就是 google.com.sg, 那么用 python 很好搞定

    from urlparse import urlparse
    url = urlparse(url)
    hostname = url.hostname
    

    hostname 就是 www.google.com.sg

    但是前缀 www 的剔除就没法准确的实现了, 我只要 google.com.sg

    前缀什么样的都有, 可能是 https://mail.google.com.sg/mail/u/0/#inbox

    把第一个 . 前的内容直接剔除? 那如果输入的是 google.com.sg 那就出问题了.

    小工具 pp 里要用到, 各位有什么优雅完美的办法么?

    第 1 条附言  ·  2017-07-01 13:31:18 +08:00
    看了下建议,基本还是得扫外部的库,否则很难准确的判断出 domain 了

    开放注册的网址后缀太多,已经被玩坏的感觉
    第 2 条附言  ·  2017-07-01 19:21:35 +08:00
    感叹下,v2ex 还被拦在外面时,氛围比现在好多了。
    现在一些人连阅读理解能力都没有,过来就一副居高临下教育的样子,上来就一口一个年轻人,少年~~
    想讨论个问题还得拉黑一批人,心累

    认真回复的朋友,我都尽量一一感谢了,谢谢大家
    33 条回复    2017-07-02 22:16:38 +08:00
    hx1997
        1
    hx1997  
       2017-07-01 12:15:22 +08:00 via Android
    从后往前扫,到第一个不是顶级域的域名为止?
    msg7086
        2
    msg7086  
       2017-07-01 12:18:40 +08:00   ❤️ 2
    domain 就应该是 www.google.com.sg
    我就问你,www.sb 你指望返回什么结果?
    再问你,acm.pku.edu.ax 你指望返回什么结果?
    hx1997
        3
    hx1997  
       2017-07-01 12:19:42 +08:00 via Android
    啊,上面的术语不是很准确。我的意思就是看看每个点后面是不是有效的域名后缀,比如 .com 和 .sg 都是,但 .google 就不是。
    msg7086
        4
    msg7086  
       2017-07-01 12:22:28 +08:00   ❤️ 1
    @hx1997 .google 是完全有效的域名后缀。https://domains.google/
    neilp
        5
    neilp  
       2017-07-01 12:23:47 +08:00
    @hx1997
    `.google` 其实也是: https://www.registry.google/
    neilp
        6
    neilp  
       2017-07-01 12:24:59 +08:00
    比较靠谱的做法 是 扫描 这个 列表: https://publicsuffix.org/
    msg7086
        7
    msg7086  
       2017-07-01 12:33:10 +08:00
    另外我看了你的源码。说真的,为什么要重新发明一次轮子呢。
    安全性什么的我先不提,digest 出来的密码只会用到 0-9a-f,遇上要求字母+数字+符号复杂度的密码(比如 Windows Server 登录密码),直接就过不去了……
    nfroot
        8
    nfroot  
       2017-07-01 13:16:49 +08:00
    首先呢,你去收集到所有域名后缀,然后从后面往前面查询
    bigzhu
        9
    bigzhu  
    OP
       2017-07-01 13:26:57 +08:00 via Android
    @msg7086 也就登录下网站,够用了。登录 Server 的不要用这个
    xfspace
        10
    xfspace  
       2017-07-01 13:26:59 +08:00 via Android
    从第一个双斜杠截到第一个单斜杠
    momocraft
        11
    momocraft  
       2017-07-01 13:28:39 +08:00   ❤️ 1
    "单用程序貌似搞不定" 这个直觉是对的, 这个问题确实需要额外知识如 public suffix list
    imn1
        12
    imn1  
       2017-07-01 13:33:00 +08:00
    那么,
    www.net.cn
    你期望结果是什么?
    yhxx
        13
    yhxx  
       2017-07-01 13:39:44 +08:00
    从后往前也不行
    比如 www.asdf.com?xxxx=qwerty.cn
    dynos01
        14
    dynos01  
       2017-07-01 13:49:54 +08:00 via iPad
    还有 http://sb.
    然后还有各类免费二级域名,你抓个看看?
    hx1997
        15
    hx1997  
       2017-07-01 14:41:18 +08:00 via Android
    @neilp 这。。。现在的域名后缀真是够了
    dsg001
        16
    dsg001  
       2017-07-01 15:02:08 +08:00   ❤️ 2
    学会搜索 关键词“ python extract domain ”

    https://github.com/john-kurkowski/tldextract

    >>> import tldextract

    >>> tldextract.extract('http://forums.news.cnn.com/')
    ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')

    >>> tldextract.extract('http://forums.bbc.co.uk/') # United Kingdom
    ExtractResult(subdomain='forums', domain='bbc', suffix='co.uk')

    >>> tldextract.extract('http://www.worldbank.org.kg/') # Kyrgyzstan
    ExtractResult(subdomain='www', domain='worldbank', suffix='org.kg')
    bigzhu
        17
    bigzhu  
    OP
       2017-07-01 17:36:59 +08:00 via Android
    @dsg001 不需要你来教我搜索
    你说这个,我早就看过了。
    就是想讨论下,不关联匹配库,是否有办法。
    nVic
        18
    nVic  
       2017-07-01 17:43:31 +08:00 via iPhone   ❤️ 1
    真的是服了,还是拉黑比较好。
    xyjtou
        19
    xyjtou  
       2017-07-01 17:45:41 +08:00 via Android   ❤️ 1
    现在的域名后缀这么乱,取主域名越来越难匹配了
    flyz
        20
    flyz  
       2017-07-01 17:59:41 +08:00 via Android   ❤️ 1
    @bigzhu 年轻人,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
    binux
        21
    binux  
       2017-07-01 18:10:02 +08:00   ❤️ 1
    @bigzhu #17 不可以,tld 是人为定义的,这个外部知识无法忽略。
    dream7758522
        22
    dream7758522  
       2017-07-01 18:58:16 +08:00 via Android
    少年,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
    bigzhu
        23
    bigzhu  
    OP
       2017-07-01 19:03:12 +08:00 via Android
    @dream7758522 不好意思,我应该年纪比你大,你可能才是少年。
    我没说别人欠我什么,但是我也不喜欢别人不做好阅读理解,上来就一副教育的口气。
    拉黑不送
    bigzhu
        24
    bigzhu  
    OP
       2017-07-01 19:04:22 +08:00 via Android
    @nVic 是的,拉黑你比较好
    yangff
        25
    yangff  
       2017-07-01 19:25:53 +08:00 via Android   ❤️ 1
    原理上,大家都是“.”下的域名。。
    所以,没有列表的情况下,你只能提取出.
    bigzhu
        26
    bigzhu  
    OP
       2017-07-01 19:32:04 +08:00 via Android
    @yangff 嗯,看来是不可能通过正则等单纯的代码,分析出一个 url 的主域名了,毕竟子域名也是域名
    liyvhg
        27
    liyvhg  
       2017-07-01 19:36:27 +08:00 via Android
    先取出完整的 domain,再查一下 Whois,应该就可以了
    msg7086
        28
    msg7086  
       2017-07-02 03:07:05 +08:00
    楼主你别闹了。
    回复里说你年轻人这已经很客气了。
    你见过聊着聊着突然有人就开始问候你全家还跑到推特新开一个账号去远程喷你的吗?

    v 站氛围早就炸了……
    bigzhu
        29
    bigzhu  
    OP
       2017-07-02 09:42:56 +08:00
    @msg7086 问题也讨论清楚了, 歪楼无所谓.
    该怼的怼, 该 B 的 B. 不想忍让, B 了更好, 反正不是一个世界的人.
    话说 V2EX 也是该考虑好友共享黑名单机制了. 随着用户增加, 一个社区的劣质化是无法避免的.

    中文社区氛围最好的就是草榴了, 但技术社区还有哪个质量更好的? 我还真不知道了.
    Kilerd
        30
    Kilerd  
       2017-07-02 11:41:10 +08:00
    from yarl import URL
    blueset
        31
    blueset  
       2017-07-02 13:39:39 +08:00 via Android
    (假设地址合法(Valid))
    1. 提取域名。( protocol:lorem.ipsum.example.com/path/file.ext?a=b&c=d#efglorem.ipsum.example.com
    2. 如果最后一段是数字,则作为 IP 地址
    3. 从所有已知后缀中依次匹配,后缀相同的优先匹配较长的(如有 .com.cn 和 .cn,优先匹配 .com.cn ),然后提取匹配到的前缀和之前一个( losem.ipsum.example.comexample.com )。

    如果前面什么都没剩,保留整个域名(如 net.cnnet.cn
    如果没有匹配,fallback 到其他方法( WHOIS 等)
    msg7086
        32
    msg7086  
       2017-07-02 17:03:27 +08:00
    @bigzhu ruby-china,除了会安利你 ruby 以外,喷子也更少。
    bigzhu
        33
    bigzhu  
    OP
       2017-07-02 22:16:38 +08:00
    @msg7086 氛围确实挺好, 讨论更专注在技术上. 即使我对 ruby 一直无感, 也要多逛逛那里了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3307 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 12:05 · PVG 20:05 · LAX 04:05 · JFK 07:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.