如何从多种类型的url,子域,url与端口号等在Python提取根域名?



我想从以下子域名中提取根域名,python中的url。

1) https://abc.example.com/dir
2) http://abc.example.abde?param=value
3) https://aaa.abc.example.zaddj?param=value
4) tcp://cces.example.com:5598
5) ccc.ddd.example.com

我已经尝试了如下所述的多个方法,但没有一个方法可以正常工作,

方法1尝试使用python库:urlparse

它不工作,因为数字4和5是非HTTP url和urlparse无法理解。使用如下代码:

from urllib.parse import urlparse
def get_root_domain_from_url(url):
parsed_url = urlparse(url)
domain_parts = parsed_url.netloc.split('.')
if len(domain_parts) > 2:
root_domain = domain_parts[-2] + '.' + domain_parts[-1]
else:
root_domain = parsed_url.netloc
return root_domain

方法2尝试使用python库:tlextract

它不起作用,因为数字2和3是非TLD域,所以tlextract没有返回有效结果。使用如下代码:

import tldextract
def get_root_domain_from_url(url):
extracted = tldextract.extract(url)
if extracted.subdomain:
root_domain = extracted.subdomain[:-1] + '.' + extracted.domain + '.' + extracted.suffix
else:
root_domain = extracted.domain + '.' + extracted.suffix
return root_domain

方法3尝试使用python regex.

它不能正常工作,因为URL方案可能会在每个场景中更改。此外,我在为这些事情创建正则表达式方面有点弱。

我想要的结果如下:

https://abc.example.com/dir -> example.com
http://abc.example.abde?param=value -> example.abde
https://aaa.abc.example.zaddj?param=value -> example.zaddj
tcp://cces.example.com:5598 -> example.com
ccc.ddd.example.com -> example.com

对于search/group,我会使用regex方法:

def get_root_domain_from_url(url):
p = r"(?:w+://)?(?:w+.)*(w+.[a-z]+)(?:[/?:]?.*)"
root_domain = re.search(p, url).group(1)
return root_domain
  • (?:w+://)?:匹配可选协议指定符,但不捕获
  • (?:w+.)*:匹配零或
  • (w+.[a-z]+):匹配域名(例如,example.com)并捕获它
  • (?:[/?:]?.*):匹配域后的可选路径而不捕获它

测试/输出:

for url in list_urls:
print(f"{url} -> {get_root_domain_from_url(url)}")
https://abc.example.com/dir -> example.com
http://abc.example.abde?param=value -> example.abde
https://aaa.abc.example.zaddj?param=value -> example.zaddj
tcp://cces.example.com:5598 -> example.com
ccc.ddd.example.com -> example.com

Demo: [Regex101]

最新更新