Получить корневой домен ссылки - PullRequest
18 голосов
/ 05 октября 2009

У меня есть ссылка, такая как http://www.techcrunch.com/, и я хотел бы получить только часть ссылки techcrunch.com. Как мне сделать это в Python?

Ответы [ 6 ]

25 голосов
/ 05 октября 2009

Получить имя хоста достаточно просто, используя urlparse :

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

Однако получить «корневой домен» будет более проблематично, поскольку он не определен всинтаксический смысл.Что является корневым доменом "www.theregister.co.uk"?Как насчет сетей, использующих домены по умолчанию?"devbox12" может быть допустимым именем хоста.

Один из способов справиться с этим - использовать Public Suffix List , который пытается каталогизировать оба реальных домена верхнего уровня (например, ".com", ".net", ".org"), а также частные домены, которые используются как TLD (например, ".co.uk" или даже ".github.io").Вы можете получить доступ к PSL из Python с помощью библиотеки 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)
8 голосов
/ 29 января 2017

Общая структура 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 с другой стороны, знает, что такое все рДВУ [ Общие домены верхнего уровня ] и нДВУ [ Домены верхнего уровня с кодом страны ] выглядят как ища живых в настоящее время в соответствии с государственным суффиксом Список. Таким образом, учитывая URL, он знает свой поддомен из своего домена, и его домен из кода страны.

Cheerio! :)

2 голосов
/ 06 февраля 2017

Следующий скрипт не идеален, но может использоваться для отображения / сокращения. Если вы действительно хотите / должны избегать каких-либо сторонних зависимостей - особенно удаленно извлекать и кэшировать некоторые 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
0 голосов
/ 10 апреля 2017
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:])
0 голосов
/ 21 августа 2015

______ Использование 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 - это TLD, в то время как в http://sub.twitter.com мы имеем только .com в качестве TLD и sub - это поддомен.

Итак, нам нужно получить файл / список, в котором есть все tlds .

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:])
0 голосов
/ 30 июля 2010

Это сработало для моих целей. Я решил поделиться этим.

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