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?

¿Fue útil?

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:])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top