下面是我的完整回答.
提取url中的域名是一个常见的需求.在Python中,可以使用多种方法来实现这一目标.
Python内置了一个urllib.parse库,它可以帮助我们解析url中的各个部分.
我们只需要使用urlsplit函数来将url分解成几个部分,然后从中提取出域名即可.代码如下:
from urllib.parse import urlsplit
url = "https://www.baidu.com"
domain = urlsplit(url).hostname
print(domain) # baidu.com
正则表达式是一种强大的字符串匹配工具,可以用来匹配特定模式的字符串,所以呢也可以用来提取url中的域名.
常见的域名有一些特征,比如全是英文字母、数字和点号组成,而且其中含有一个或多个点号.我们可以利用这些特征来编写正则表达式.代码如下:
import re
url = "https://www.baidu.com"
domain = re.search("[a-zA-Z0-9]+\.[a-zA-Z0-9]+", url).group()
print(domain) # baidu.com
Python中有一些第三方库可以帮助我们提取url中的域名.其中比较常用的是tldextract库.
tldextract库可以自动识别出url中的顶级域名(TLD),包括域名和子域名在内的所有部分.代码如下:
import tldextract
url = "https://www.baidu.com"
domain = tldextract.extract(url).registered_domain
print(domain) # baidu.com
以上三种方法都可以提取url中的域名,但有时候我们只需要提取一级域名,即顶级域名的一级子域名.
使用方法一和方法三需要些许修改,使用方法一需要用rslipt函数切片分割域名,第三种方法需要使用subdomain属性.
方法一(修改后):
from urllib.parse import urlsplit
url = "https://www.baidu.com"
domain = urlsplit(url).hostname
first_level_domain = '.'.join(domain.split('.')[-2:])
print(first_level_domain) # baidu.com
方法三(修改后):
import tldextract
url = "https://www.baidu.com"
domain = tldextract.extract(url)
first_level_domain = '.'.join([domain.domain, domain.suffix]) # 构建一级域名
print(first_level_domain) # baidu.com
有时候我们还需要提取url中的子域名.我们可以使用方法三中的subdomain属性来实现.代码如下:
import tldextract
url = "https://www.news.baidu.com"
domain = tldextract.extract(url)
subdomain = domain.subdomain
print(subdomain) # news