bigzhu
V2EX  ›  问与答

如何根据 url 准确取出 domain?

By bigzhu at 2017 年 7 月 1 日 · 5459 次点击

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

比如有个 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 年 7 月 1 日
看了下建议,基本还是得扫外部的库,否则很难准确的判断出 domain 了

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

认真回复的朋友,我都尽量一一感谢了,谢谢大家
33 条回复  •  2017-07-02 22:16:38 +08:00
hx1997
   1
hx1997  
   2017 年 7 月 1 日 via Android
从后往前扫,到第一个不是顶级域的域名为止?
msg7086
   2
msg7086  
   2017 年 7 月 1 日   ❤️ 2
domain 就应该是 www.google.com.sg。
我就问你,www.sb 你指望返回什么结果?
再问你,acm.pku.edu.ax 你指望返回什么结果?
hx1997
   3
hx1997  
   2017 年 7 月 1 日 via Android
啊,上面的术语不是很准确。我的意思就是看看每个点后面是不是有效的域名后缀,比如 .com 和 .sg 都是,但 .google 就不是。
msg7086
   4
msg7086  
   2017 年 7 月 1 日   ❤️ 1
@hx1997 .google 是完全有效的域名后缀。https://domains.google/
neilp
   5
neilp  
   2017 年 7 月 1 日
@hx1997
`.google` 其实也是: https://www.registry.google/
neilp
   6
neilp  
   2017 年 7 月 1 日
比较靠谱的做法 是 扫描 这个 列表: https://publicsuffix.org/
msg7086
   7
msg7086  
   2017 年 7 月 1 日
另外我看了你的源码。说真的,为什么要重新发明一次轮子呢。
安全性什么的我先不提,digest 出来的密码只会用到 0-9a-f,遇上要求字母+数字+符号复杂度的密码(比如 Windows Server 登录密码),直接就过不去了……
nfroot
   8
nfroot  
   2017 年 7 月 1 日
首先呢,你去收集到所有域名后缀,然后从后面往前面查询
bigzhu
   9
bigzhu  
OP
   2017 年 7 月 1 日 via Android
@msg7086 也就登录下网站,够用了。登录 Server 的不要用这个
xfspace
   10
xfspace  
   2017 年 7 月 1 日 via Android
从第一个双斜杠截到第一个单斜杠
momocraft
   11
momocraft  
   2017 年 7 月 1 日   ❤️ 1
"单用程序貌似搞不定" 这个直觉是对的, 这个问题确实需要额外知识如 public suffix list
imn1
   12
imn1  
   2017 年 7 月 1 日
那么,
www.net.cn
你期望结果是什么?
yhxx
   13
yhxx  
   2017 年 7 月 1 日
从后往前也不行
比如 www.asdf.com?xxxx=qwerty.cn
dynos01
   14
dynos01  
   2017 年 7 月 1 日 via iPad
还有 http://sb.
然后还有各类免费二级域名,你抓个看看?
hx1997
   15
hx1997  
   2017 年 7 月 1 日 via Android
@neilp 这。。。现在的域名后缀真是够了
dsg001
   16
dsg001  
   2017 年 7 月 1 日   ❤️ 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 年 7 月 1 日 via Android
@dsg001 不需要你来教我搜索
你说这个,我早就看过了。
就是想讨论下,不关联匹配库,是否有办法。
nVic
   18
nVic  
   2017 年 7 月 1 日 via iPhone   ❤️ 1
真的是服了,还是拉黑比较好。
xyjtou
   19
xyjtou  
   2017 年 7 月 1 日 via Android   ❤️ 1
现在的域名后缀这么乱,取主域名越来越难匹配了
fstab
   20
fstab  
   2017 年 7 月 1 日 via Android   ❤️ 1
@bigzhu 年轻人,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
binux
   21
binux  
   2017 年 7 月 1 日   ❤️ 1
@bigzhu #17 不可以,tld 是人为定义的,这个外部知识无法忽略。
dream7758522
   22
dream7758522  
   2017 年 7 月 1 日 via Android
少年,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
bigzhu
   23
bigzhu  
OP
   2017 年 7 月 1 日 via Android
@dream7758522 不好意思,我应该年纪比你大,你可能才是少年。
我没说别人欠我什么,但是我也不喜欢别人不做好阅读理解,上来就一副教育的口气。
拉黑不送
bigzhu
   24
bigzhu  
OP
   2017 年 7 月 1 日 via Android
@nVic 是的,拉黑你比较好
yangff
   25
yangff  
   2017 年 7 月 1 日 via Android   ❤️ 1
原理上,大家都是“.”下的域名。。
所以,没有列表的情况下,你只能提取出.
bigzhu
   26
bigzhu  
OP
   2017 年 7 月 1 日 via Android
@yangff 嗯,看来是不可能通过正则等单纯的代码,分析出一个 url 的主域名了,毕竟子域名也是域名
liyvhg
   27
liyvhg  
   2017 年 7 月 1 日 via Android
先取出完整的 domain,再查一下 Whois,应该就可以了
msg7086
   28
msg7086  
   2017 年 7 月 2 日
楼主你别闹了。
回复里说你年轻人这已经很客气了。
你见过聊着聊着突然有人就开始问候你全家还跑到推特新开一个账号去远程喷你的吗?

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

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

如果前面什么都没剩,保留整个域名(如 net.cn→net.cn )
如果没有匹配,fallback 到其他方法( WHOIS 等)
msg7086
   32
msg7086  
   2017 年 7 月 2 日
@bigzhu ruby-china,除了会安利你 ruby 以外,喷子也更少。
bigzhu
   33
bigzhu  
OP
   2017 年 7 月 2 日
@msg7086 氛围确实挺好, 讨论更专注在技术上. 即使我对 ruby 一直无感, 也要多逛逛那里了.
© 2026 V2EX · 65ms · 3.9.8.5