Получить корневую область связи

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

Ответы

Ответ 1

Получение имени хоста достаточно просто, используя 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)

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

Cheerio! :)

Ответ 3

После script не является совершенным, но может использоваться для отображения/сокращения. Если вам действительно нужно/нужно избегать зависимостей третьих сторон, особенно отдаленно и кэшируя некоторые данные, я могу предложить вам следующее script, которое я использую в своих проектах. Он использует последние две части домена для большинства распространенных расширений домена и оставляет последние три части для отдыха менее известных расширений домена. В худшем случае область сценария будет иметь три части вместо двух:

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

Ответ 4

______ Использование 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:])

Ответ 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 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:])

Ответ 6

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

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