2009-10-05 14 views

Odpowiedz

24

Uzyskiwanie nazwy hosta jest wystarczająco łatwe przy użyciu urlparse:

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

Pierwsze „domena root”, jednak będzie bardziej problematyczne, ponieważ nie jest zdefiniowane w sensie syntaktycznym. Jaka jest domena główna witryny "www.theregister.co.uk"? Co powiesz na sieci korzystające z domen domyślnych? "devbox12" może być prawidłową nazwą hosta.

Jednym ze sposobów radzenia sobie z tym byłoby użycie Public Suffix List, która próbuje skatalogować prawdziwe domeny najwyższego poziomu (np. ".com", ".net", ".org"), jak również prywatne domeny, które są używane jak TLD (np. ".co.uk" lub nawet ".github.io"). Możesz uzyskać dostęp do PSL od Python przy użyciu biblioteki 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) 
+0

Proszę wyjaśnić, jak ten kod hostname = ".". join (len (nazwa hosta [-2]) <4 i nazwa hosta [-3:] lub nazwa hosta [-2:]) działa? Dzięki – Joozty

+0

@Joozty - Negatywne indeksy zaczynają się od końca, więc 'nazwa hosta [-2]' oznacza wpis następny-do-ostatniego (w tym przypadku nazwa hosta podzielona przez kropki). 'foo i bar lub baz' działa podobnie do potrójnego: jeśli" foo "jest prawdziwe, zwróć" pasek "; w przeciwnym razie zwróć "baz". Wreszcie, nazwa hosta [-3:] "oznacza ostatnie trzy części. Wszystko razem oznacza to, że "jeśli następna część nazwy hosta jest krótsza niż cztery znaki, użyj ostatnich trzech części i połącz je razem z kropkami. W przeciwnym razie weź tylko dwie ostatnie części i połącz je razem". –

+0

Z jakiegoś powodu, nawet po zainstalowaniu modułu, na Pythonie 3 otrzymuję 'ImportError: nie mogę zaimportować nazwy 'get_public_suffix''. Nie można znaleźć żadnej odpowiedzi w trybie online lub w dokumentacji, więc po prostu użyłem "tldextract" zamiast, który po prostu działa! Oczywiście musiałem najpierw "sudo pip3 install tldextract". – Nagev

-4

Ten pracował dla moich celów. Pomyślałem, że się tym podzielę.

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

Co z testowaniem "www.sun.google.co.uk"? Otrzymasz "co.uk" zamiast "google.co.uk" ... Pozdrawiam! –

+3

Ya, użyj podejścia Bena Blanka. Nie jestem pewien, co myślałem (w 2010 r.) :-) –

0

______Using Python 3.3 i nie 2.x ________

Chciałbym dodać małą rzeczą, aby odpowiedzieć Ben Blanka.

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 

Teraz, właśnie nazwę domeny z urlparse.

Aby usunąć subdomeny, musisz przede wszystkim wiedzieć, które domeny najwyższego poziomu są domenami najwyższego poziomu, a które nie. Na przykład. w powyższym http://twitter.co.uk - jest TLD, natomiast w http://sub.twitter.com mamy tylko .com jako TLD a sub jest poddomeny.

Potrzebujemy zatem pliku/listy, który ma wszystkie 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

Ogólna struktura URL:

scheme://netloc/path;parameters?query#fragment

As TIMTOWTDI motto:

Korzystanie 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/' 

Korzystanie 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') 

w przypadku:

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

tldextract on the other hand knows what all gTLDs [Generic Top-Level Domains] and ccTLDs [Country Code Top-Level Domains] look like by looking up the currently living ones according to the Public Suffix List. So, given a URL, it knows its subdomain from its domain, and its domain from its country code.

Cheerio!:)

2

Poniższy scenariusz nie jest idealny, ale może być używany do wyświetlania/skracania. Jeśli naprawdę chcesz/musisz unikać jakichkolwiek zależności od innych firm - zwłaszcza zdalnie pobierasz i buforujesz niektóre dane, mogę zasugerować ci wykonanie skryptu, którego używam w moich projektach. Wykorzystuje ostatnie dwie części domeny do najpopularniejszych rozszerzeń domen i pozostawia ostatnie trzy części dla reszty mniej znanych rozszerzeń domen. W najgorszym przypadku domeny scenariusz będzie miał trzy części zamiast dwóch:

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
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:]) 
Powiązane problemy