2009-10-05 15 views

Respuesta

24

Conseguir el nombre de host es bastante fácil de usar urlparse:

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

Conseguir el "dominio de la raíz", sin embargo, va a ser más problemático, ya que no está definido en un sentido sintáctico. ¿Cuál es el dominio raíz de "www.theregister.co.uk"? ¿Qué hay de las redes que usan dominios predeterminados? "devbox12" podría ser un nombre de host válido.

Una manera de manejar esto sería el uso de la Public Suffix List, que trata de catalogar los dos dominios de nivel superior reales (por ejemplo, ".com", ".org," ".net"), así como dominios privados que son Usó como TLD (por ejemplo, ".co.uk" o incluso ".github.io"). Puede acceder a la PSL de Python usando la biblioteca 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

Puede explicar cómo este código nombre de host = ".". join (len (nombre de host [-2]) <4 y nombre de host [-3:] o nombre de host [-2:] ¿funciona? Gracias – Joozty

+0

@Joozty - Los índices negativos comienzan desde el final, por lo que 'nombre de host [-2]' significa la penúltima entrada (en este caso, el nombre de host dividido por puntos). 'foo y bar o baz' funciona como un ternario: si" foo "es verdadero, devuelve" barra "; de lo contrario, devuelve "baz". Finalmente, 'hostname [-3:]' significa las últimas tres partes. En conjunto, esto significa que "si la penúltima parte del nombre de host tiene menos de cuatro caracteres, use las últimas tres partes y únelas con puntos. De lo contrario, tome solo las dos últimas partes y únelas". –

+0

Por alguna razón, incluso después de instalar el módulo, en Python 3 obtengo 'ImportError: no puedo importar el nombre 'get_public_suffix''. No pude encontrar ninguna respuesta en línea o en la documentación, así que simplemente usé "tldextract" en su lugar, ¡lo que simplemente funciona! Por supuesto, tuve que 'sudo pip3 install tldextract' primero. – Nagev

-4

Esto funcionó para mis propósitos. Pensé que lo compartiría.

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

¿Qué tal probar "www.sun.google.co.uk"? Obtendrá "co.uk" en lugar de "google.co.uk" ... ¡Saludos! –

+3

Ya, usa el enfoque de Ben Blank. No estoy seguro de lo que estaba pensando (en 2010) :-) –

0

______Using Python 3.3 y 2.x no ________

Me gustaría añadir una cosa pequeña a la respuesta de Ben en blanco.

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 

Por ahora, sólo tiene el nombre de dominio de urlparse.

Para eliminar los subdominios, primero debes saber cuáles son dominios de nivel superior y cuáles no. P.ej. en el anterior http://twitter.co.uk - co.uk es un TLD mientras que en http://sub.twitter.com tenemos solo .com como TLD y sub es un subdominio.

Por lo tanto, necesitamos obtener un archivo/lista que tenga todos los 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

Estructura general de URL:

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

Como TIMTOWTDI lema:

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

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

en su caso:

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

El siguiente script no es perfecto, pero se puede utilizar para visualizar/acortar. Si realmente quiere/necesita evitar dependencias de terceros, especialmente buscar de forma remota y almacenar en caché algunos datos de TLD, le sugiero que siga el script que uso en mis proyectos. Utiliza las dos últimas partes del dominio para las extensiones de dominio más comunes y deja las últimas tres partes para el resto de las extensiones de dominio menos conocidas. En peor de los casos dominio escenario tendrá tres partes: en lugar de dos

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