获取链接的根域名

24 投票
9 回答
29566 浏览
提问于 2025-04-15 14:49

我有一个链接,比如 http://www.techcrunch.com/,我想只提取出 techcrunch.com 这一部分。请问我该怎么用 Python 来实现这个呢?

9 个回答

4

下面这个脚本虽然不是完美的,但可以用来显示或缩短网址。如果你真的想避免使用任何第三方的依赖,特别是那些需要远程获取和缓存顶级域名数据的情况,我可以推荐一个我在项目中使用的脚本。这个脚本会使用域名的最后两个部分来处理最常见的域名后缀,而对于那些不太常见的域名后缀,它会保留最后三个部分。在最糟糕的情况下,域名会有三个部分,而不是两个:

from urlparse import urlparse

def extract_domain(url):
    parsed_domain = urlparse(url)
    domain = parsed_domain.netloc or parsed_domain.path # Just in case, for urls without scheme
    domain_parts = domain.split('.')
    if len(domain_parts) > 2:
        return '.'.join(domain_parts[-(2 if domain_parts[-1] in {
            'com', 'net', 'org', 'io', 'ly', 'me', 'sh', 'fm', 'us'} else 3):])
    return domain

extract_domain('google.com')          # google.com
extract_domain('www.google.com')      # google.com
extract_domain('sub.sub2.google.com') # google.com
extract_domain('google.co.uk')        # google.co.uk
extract_domain('sub.google.co.uk')    # google.co.uk
extract_domain('www.google.com')      # google.com
extract_domain('sub.sub2.voila.fr')   # sub2.voila.fr
17

URL的一般结构是:

协议://网络地址/路径;参数?查询#片段

正如TIMTOWTDI的座右铭:

使用 urlparse

>>> from urllib.parse import urlparse  # python 3.x
>>> parsed_uri = urlparse('http://www.stackoverflow.com/questions/41899120/whatever')  # returns six components
>>> domain = '{uri.netloc}/'.format(uri=parsed_uri)
>>> result = domain.replace('www.', '')  # as per your case
>>> print(result)
'stackoverflow.com/'  

使用 tldextract

>>> import tldextract  # The module looks up TLDs in the Public Suffix List, mantained by Mozilla volunteers
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')

在你的情况下:

>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'

tldextract 知道所有的gTLDs [通用顶级域名] 和 ccTLDs [国家代码顶级域名] 是什么样子的,它通过查找当前存在的域名来获取这些信息,这些信息来自公共后缀列表。因此,给定一个URL,它可以从域名中识别出子域名,并根据国家代码识别出域名。

再见! :)

36

获取主机名其实很简单,可以使用urlparse这个工具:

hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname

不过,获取“根域名”就比较麻烦了,因为根域名并没有一个明确的语法定义。比如“www.theregister.co.uk”的根域名是什么呢?再比如一些使用默认域名的网络,“devbox12”也可能是一个有效的主机名。

解决这个问题的一种方法是使用公共后缀列表,这个列表试图记录真实的顶级域名(比如“.com”、“.net”、“.org”)以及一些像顶级域名一样使用的私有域名(比如“.co.uk”或者“.github.io”)。你可以通过publicsuffix2这个库在Python中访问公共后缀列表:

import publicsuffix
import urlparse

def get_base_domain(url):
    # This causes an HTTP request; if your script is running more than,
    # say, once a day, you'd want to cache it yourself.  Make sure you
    # update frequently, though!
    psl = publicsuffix.fetch()

    hostname = urlparse.urlparse(url).hostname

    return publicsuffix.get_public_suffix(hostname, psl)

撰写回答