看似很简单的问题, 但是单用程序貌似搞不定哦.
比如有个 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
hx1997 2017-07-01 12:15:22 +08:00 via Android
从后往前扫,到第一个不是顶级域的域名为止?
|
2
msg7086 2017-07-01 12:18:40 +08:00 2
|
3
hx1997 2017-07-01 12:19:42 +08:00 via Android
啊,上面的术语不是很准确。我的意思就是看看每个点后面是不是有效的域名后缀,比如 .com 和 .sg 都是,但 .google 就不是。
|
4
msg7086 2017-07-01 12:22:28 +08:00 1
@hx1997 .google 是完全有效的域名后缀。https://domains.google/
|
5
neilp 2017-07-01 12:23:47 +08:00
|
6
neilp 2017-07-01 12:24:59 +08:00
比较靠谱的做法 是 扫描 这个 列表: https://publicsuffix.org/
|
7
msg7086 2017-07-01 12:33:10 +08:00
另外我看了你的源码。说真的,为什么要重新发明一次轮子呢。
安全性什么的我先不提,digest 出来的密码只会用到 0-9a-f,遇上要求字母+数字+符号复杂度的密码(比如 Windows Server 登录密码),直接就过不去了…… |
8
nfroot 2017-07-01 13:16:49 +08:00
首先呢,你去收集到所有域名后缀,然后从后面往前面查询
|
10
xfspace 2017-07-01 13:26:59 +08:00 via Android
从第一个双斜杠截到第一个单斜杠
|
11
momocraft 2017-07-01 13:28:39 +08:00 1
"单用程序貌似搞不定" 这个直觉是对的, 这个问题确实需要额外知识如 public suffix list
|
12
imn1 2017-07-01 13:33:00 +08:00
|
13
yhxx 2017-07-01 13:39:44 +08:00
从后往前也不行
比如 www.asdf.com?xxxx=qwerty.cn |
14
dynos01 2017-07-01 13:49:54 +08:00 via iPad
还有 http://sb.
然后还有各类免费二级域名,你抓个看看? |
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') |
17
bigzhu OP |
18
nVic 2017-07-01 17:43:31 +08:00 via iPhone 1
真的是服了,还是拉黑比较好。
|
19
xyjtou 2017-07-01 17:45:41 +08:00 via Android 1
现在的域名后缀这么乱,取主域名越来越难匹配了
|
20
flyz 2017-07-01 17:59:41 +08:00 via Android 1
@bigzhu 年轻人,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
|
22
dream7758522 2017-07-01 18:58:16 +08:00 via Android
少年,虚心点,虽然别人的回答没有帮助,但是你不应该这个语气,回答问题是义务,别人没有欠你钱
|
23
bigzhu OP |
25
yangff 2017-07-01 19:25:53 +08:00 via Android 1
原理上,大家都是“.”下的域名。。
所以,没有列表的情况下,你只能提取出. |
26
bigzhu OP @yangff 嗯,看来是不可能通过正则等单纯的代码,分析出一个 url 的主域名了,毕竟子域名也是域名
|
27
liyvhg 2017-07-01 19:36:27 +08:00 via Android
先取出完整的 domain,再查一下 Whois,应该就可以了
|
28
msg7086 2017-07-02 03:07:05 +08:00
楼主你别闹了。
回复里说你年轻人这已经很客气了。 你见过聊着聊着突然有人就开始问候你全家还跑到推特新开一个账号去远程喷你的吗? v 站氛围早就炸了…… |
29
bigzhu OP @msg7086 问题也讨论清楚了, 歪楼无所谓.
该怼的怼, 该 B 的 B. 不想忍让, B 了更好, 反正不是一个世界的人. 话说 V2EX 也是该考虑好友共享黑名单机制了. 随着用户增加, 一个社区的劣质化是无法避免的. 中文社区氛围最好的就是草榴了, 但技术社区还有哪个质量更好的? 我还真不知道了. |
30
Kilerd 2017-07-02 11:41:10 +08:00
from yarl import URL
|
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#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 等) |