Obtener el dominio raíz del enlace
Pregunta
tengo un enlace como http://www.techcrunch.com/ y me gustaría obtener solo la parte techcrunch.com del enlace.¿Cómo hago esto en Python?
Solución
Obtener 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 la raíz del dominio "www.theregister.co.uk"? ¿Qué hay de las redes que usan dominios por defecto? "Devbox12" podría ser un nombre válido.
Una manera de manejar esto sería el uso de la href="https://publicsuffix.org/" rel="nofollow noreferrer"> lista de sufijos Pública utilizan como TLD (por ejemplo,' .es" o incluso" .github.io "). Puede acceder a la PSL de Python usando el publicsuffix2 biblioteca:
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)
Otros consejos
Estructura general de la URL:
esquema://netloc/ruta;parámetros?consulta#fragmento
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 tlextracto,
>>> 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 tu caso:
>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'
tldextract
por otro lado sabe qué son todos los gTLD [Dominios genéricos de nivel superior] y cctlds [Dominios de nivel superior con código de país] Parece buscar a los que actualmente viven según la lista de sufijos públicos.Entonces, dada una URL, conoce su subdominio de su dominio y su dominio de su código de país.
¡Ánimo! :)
Después de la escritura no es perfecta, pero se puede utilizar para la visualización / fines acortando. Si realmente quiere / necesidad de evitar cualquier dependencia de 3 ª parte - sobre todo de forma remota y almacenamiento en caché de ir a buscar algunos datos TLD Te puedo sugerir siguiente secuencia de comandos que utilizo en mis proyectos. Utiliza dos últimas partes del dominio de la mayoría de las extensiones de dominio común y deja últimos tres piezas para el descanso de las extensiones de dominios menos conocidos. 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
______ El uso de 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, acabo de recibir el nombre de dominio de urlparse .
Para eliminar los subdominios que en primer lugar hay que saber que son dominios de nivel superior y los que no lo son. P.ej. en el http://twitter.co.uk
anterior - co.uk
es un dominio de nivel superior, mientras que en http://sub.twitter.com
sólo tenemos .com
como TLD y sub
es un subdominio
Por lo tanto, tenemos que conseguir un archivo / lista que tiene toda la 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:])
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:])
Esto funcionó para mis propósitos. Pensé que había que compartirlo.
".".join("www.sun.google.com".split(".")[-2:])