用Python提取URL中的域名

89

我有一个类似的URL:
http://abc.hostname.com/somethings/anything/

我想要获取:
hostname.com

我应该使用哪个模块来实现这个功能?
我想要在Python2中使用相同的模块和方法。


3
我可以使用正则表达式来实现。 - Mike - SMT
2
你可以直接使用str.split(),它很容易。 - voltento
url.split('/')[2]会给你'abc.hostname.com',你可以使用split或re的任何方法来提取它。 - Gahan
3
可能是重复问题,但更好的答案在这里。 - Joey Baruch
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
134

要在Python 3中解析URL的域名,您可以使用:

from urllib.parse import urlparse

domain = urlparse('http://www.example.test/foo/bar').netloc
print(domain) # --> www.example.test

然而,要可靠地解析顶级域名(例如此示例中的example.test),您需要安装专门的库(例如tldextract)。


74

不需要使用正则表达式或手写解决方案,您可以使用Python的urlparse模块。

from urllib.parse import urlparse

print(urlparse('http://abc.hostname.com/somethings/anything/'))
>> ParseResult(scheme='http', netloc='abc.hostname.com', path='/somethings/anything/', params='', query='', fragment='')

print(urlparse('http://abc.hostname.com/somethings/anything/').netloc)
>> abc.hostname.com
获取没有子域名的方式
t = urlparse('http://abc.hostname.com/somethings/anything/').netloc
print ('.'.join(t.split('.')[-2:]))
>> hostname.com

7
在Python3中,名为urlparse的库已更名为urllib.parse - AIpeter
1
它能够与类似于test.mytest.example.com这样的东西一起使用吗? - qasimzee
7
它将在*.co.uk*.ac.uk域名中失败。 - mommi84
5
t.split('.')[-2:] 字面上只保留最后两个子字符串,因此我担心无论您是否添加前缀,它都将仅返回 co.ukac.uk - mommi84
1
这个(由于上述原因而错误的)答案有很多赞,然后我们想知道为什么不同的软件和网站有那么多漏洞... - Nairum
显示剩余2条评论

32

你可以使用 tldextract

示例代码:

from tldextract import extract
tsd, td, tsu = extract("http://abc.hostname.com/somethings/anything/") # prints abc, hostname, com
url = td + '.' + tsu # will prints as hostname.com    
print(url)

4
tldextract 不是标准库(至少不在 Python 2.7 中),我认为你应该强调这一点。还是赞一个。 - t.m.adam
运行得很好!但是,出现了“找不到名为‘tldextract’的记录器”的处理程序,该如何处理呢? - D09r

4
假设您已经有了一个可访问的字符串,并且假设我们希望通用地在顶级域上具有多个级别,您可以:
token=my_string.split('http://')[1].split('/')[0]
top_level=token.split('.')[-2]+'.'+token.split('.')[-1]
我们首先通过http://将字符串分割,以删除它。然后我们再通过/来分割字符串,以删除所有目录或子目录部分,然后[-2]表示我们在.之后取倒数第二个标记,然后与最后一个标记连接起来,得到顶级域名。 可能有更加优美和健壮的方法来实现这一点,例如如果您的网站是http://.com,它就会出错,但这是一个开始 :)

你的代码可以更简化。使用token=my_string.split('/')[2],虽然它也适用于ftp://和https://。 - Gahan
那是有效的反馈 :) - Henry

-5

尝试:

from urlparse import urlparse

parsed = urlparse('http://abc.hostname.com/somethings/anything/')
domain = parsed.netloc.split(".")[-2:]
host = ".".join(domain)
print host  # will prints hostname.com

1
无法与.co.uk一起使用。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,