获取链接的根域(Get Root Domain of Link)

2019-07-21 00:35发布

我有这样一个链接http://www.techcrunch.com/ ,我希望得到的只是链接的techcrunch.com一部分。 我该如何去了解这个在Python?

Answer 1:

获取主机名是很容易的使用里urlparse :

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

让“根域”,然而,将是更多的问题,因为它不是在语法意义上定义的。 什么是“www.theregister.co.uk”的根域? 如何使用默认域网络? “devbox12”可能是一个有效的主机名。

处理这一种方法是使用公共后缀列表 ,它试图编目两个真正的顶级域名(如“.COM”,“ NET”,“org”的),以及私人领域被使用的顶级域名一样(例如, “.co.uk” 或甚至 “.github.io”)。 您可以使用Python中的访问PSL publicsuffix2库:

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)


Answer 2:

URL的一般结构:

方案:// netloc /路径;参数查询#片段

作为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在另一方面知道所有的gTLD [ 通用顶级域 ]和国家代码顶级域[ 国家代码顶级域 ]通过根据公共后缀列表仰视目前居住的人的样子。 所以,对于一个URL,它知道其域名的子域,从它的国家代码其领域。

Cheerio! :)



Answer 3:

下面的脚本是不完美的,但可用于显示/缩短的目的。 如果你真的想/需要避免任何第三方的依赖关系 - 尤其是远程获取和缓存一些数据TLD我可以建议你下面的脚本,我在我的项目中使用。 它采用了最常见的域扩展域的最后两个部分,留下最后三个部分组成的鲜为人知的域扩展的休息。 在最坏的情况下域名有三个部分,而不是两个:

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


Answer 4:

______Using的Python 3.3,而不是2.x的________

我想一个小东西添加到本·布兰克的回答。

from urllib.parse import quote,unquote,urlparse
u=unquote(u) #u= URL e.g. http://twitter.co.uk/hello/there
g=urlparse(u)
u=g.netloc

到现在为止,我刚刚从域名里urlparse 。

要删除您首先需要知道哪些是顶级域,这是不是子域。 例如,在上述http://twitter.co.uk - co.uk是一个顶级域名,而在http://sub.twitter.com我们只有.com作为TLD和sub是一个子域。

所以,我们需要得到一个文件/目录拥有所有的顶级域名 。

tlds = load_file("tlds.txt") #tlds holds the list of tlds

hostname = u.split(".")
if len(hostname)>2:
    if hostname[-2].upper() in tlds:
        hostname=".".join(hostname[-3:])
    else:
        hostname=".".join(hostname[-2:])
else:
    hostname=".".join(hostname[-2:])


Answer 5:

def get_domain(url):
    u = urlsplit(url)
    return u.netloc

def get_top_domain(url):
    u"""
    >>> get_top_domain('http://www.google.com')
    'google.com'
    >>> get_top_domain('http://www.sina.com.cn')
    'sina.com.cn'
    >>> get_top_domain('http://bbc.co.uk')
    'bbc.co.uk'
    >>> get_top_domain('http://mail.cs.buaa.edu.cn')
    'buaa.edu.cn'
    """
    domain = get_domain(url)
    domain_parts = domain.split('.')
    if len(domain_parts) < 2:
        return domain
    top_domain_parts = 2
    # if a domain's last part is 2 letter long, it must be country name
    if len(domain_parts[-1]) == 2:
        if domain_parts[-1] in ['uk', 'jp']:
            if domain_parts[-2] in ['co', 'ac', 'me', 'gov', 'org', 'net']:
                top_domain_parts = 3
        else:
            if domain_parts[-2] in ['com', 'org', 'net', 'edu', 'gov']:
                top_domain_parts = 3
    return '.'.join(domain_parts[-top_domain_parts:])


Answer 6:

这个工作对我的目的。 我想我会分享。

".".join("www.sun.google.com".split(".")[-2:])


文章来源: Get Root Domain of Link