2009-10-05 11 views

Répondre

24

Obtenir le nom d'hôte est assez facile en utilisant urlparse:

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

Obtenir le « domaine racine », cependant, va être plus problématique, car il est pas défini dans un sens syntaxique. Quel est le domaine racine de "www.theregister.co.uk"? Que diriez-vous des réseaux utilisant des domaines par défaut? "devbox12" pourrait être un nom d'hôte valide. Une façon de gérer cela serait d'utiliser le Public Suffix List, qui tente de cataloguer les deux domaines de premier niveau réels (par exemple ".com", ".net", ".org") ainsi que les domaines privés utilisé comme TLD (par exemple ".co.uk" ou même ".github.io"). Vous pouvez accéder au PSL de Python en utilisant la bibliothèque 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

Pouvez-vous expliquer comment ce code hostname = ".". join (len (nom d'hôte [-2]) <4 et nom d'hôte [-3:] ou nom d'hôte [-2:]) fonctionne? Merci – Joozty

+0

@Joozty - Les index négatifs commencent à la fin, donc 'hostname [-2]' signifie l'avant-dernière entrée (dans ce cas, le nom d'hôte est divisé par des points). 'foo and bar ou baz' fonctionne un peu comme un ternaire: si" foo "est vrai, retourne" bar "; sinon, retourne "baz". Enfin, 'hostname [-3:]' signifie les trois dernières parties. Tous ensemble, cela signifie "Si l'avant-dernière partie du nom d'hôte est plus courte que quatre caractères, utilisez les trois dernières parties et joignez-les avec des points, sinon prenez seulement les deux dernières parties et joignez-les ensemble." –

+0

Pour une raison quelconque, même après l'installation du module, sur Python 3 j'obtiens 'ImportError: impossible d'importer le nom 'get_public_suffix''. N'a pas pu trouver de réponse en ligne ou dans la documentation, donc juste utilisé "tldextract" au lieu de cela qui fonctionne! Bien sûr, je devais d'abord 'sudo pip3 installer tldextract'. – Nagev

-4

Cela a fonctionné pour mes fins. Je pensais que je le partagerais.

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

Que diriez-vous de tester "www.sun.google.co.uk"? Vous obtiendrez "co.uk" au lieu de "google.co.uk" ... Bravo! –

+3

Ya, utilisez l'approche de Ben Blank. Je ne sais pas ce que je pensais (en 2010) :-) –

0

______Using Python 3.3 et non 2.x ________

Je voudrais ajouter une petite chose à la réponse de Ben Blank.

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 

Maintenant, je viens de recevoir le nom de domaine de urlparse.

Pour supprimer les sous-domaines, vous devez d'abord savoir quels sont les domaines de premier niveau et lesquels ne le sont pas. Par exemple. dans le http://twitter.co.uk ci-dessus - co.uk est un TLD tandis que dans http://sub.twitter.com nous avons seulement .com comme TLD et sub est un sous-domaine. Donc, nous devons obtenir un fichier/liste qui a tous les 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

Structure générale URL:

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

Comme TIMTOWTDI devise:

En utilisant 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/' 

En utilisant 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') 

dans votre cas:

>>> 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

Le script suivant n'est pas parfait, mais peut être utilisé à des fins d'affichage/raccourcissement. Si vous voulez vraiment éviter les dépendances de tiers - en particulier récupérer et mettre en cache à distance certaines données tld, je peux vous suggérer le script suivant que j'utilise dans mes projets. Il utilise les deux dernières parties du domaine pour les extensions de domaine les plus courantes et laisse les trois dernières parties pour le reste des extensions de domaine moins connues. Dans le pire des cas, le domaine du scénario aura trois parties au lieu de deux:

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:])