python - Cómo extraer el nombre de dominio de nivel superior(TLD) de la URL
parsing dns (7)
Aquí hay un gran módulo de python que alguien escribió para resolver este problema después de ver esta pregunta: https://github.com/john-kurkowski/tldextract
El módulo busca los TLD en la lista de sufijos públicos , mantenidos por voluntarios de Mozilla
Citar:
tldextract
otro lado,tldextract
sabe a qué setldextract
todos los gTLD [ Dominios de nivel superior genéricos ] y los ccTLD [ Dominios de nivel superior de código de país ] al buscar los que están actualmente vivos de acuerdo con 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.
¿cómo extraerías el nombre de dominio de una URL, excluyendo cualquier subdominio?
Mi primer intento simplista fue:
''.''.join(urlparse.urlparse(url).netloc.split(''.'')[-2:])
Esto funciona para http://www.foo.com , pero no para http://www.foo.com.au . ¿Hay alguna manera de hacerlo correctamente sin utilizar conocimientos especiales sobre TLD válidos (Dominios de nivel superior) o códigos de país (porque cambian)?
Gracias
Así es como lo manejo:
if not url.startswith(''http''):
url = ''http://''+url
website = urlparse.urlparse(url)[1]
domain = (''.'').join(website.split(''.'')[-2:])
match = re.search(r''((www/.)?([A-Z0-9.-]+/.[A-Z]{2,4}))'', domain, re.I)
if not match:
sys.exit(2)
elif not match.group(0):
sys.exit(2)
Hasta que get_tld se actualice para todos los nuevos, saco el tld del error. Claro que es un código malo, pero funciona.
def get_tld():
try:
return get_tld(self.content_url)
except Exception, e:
re_domain = re.compile("Domain ([^ ]+) didn''t match any existing TLD name!");
matchObj = re_domain.findall(str(e))
if matchObj:
for m in matchObj:
return m
raise e
Hay muchos, muchos TLD. Aquí está la lista:
http://data.iana.org/TLD/tlds-alpha-by-domain.txt
Aquí hay otra lista
http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Aquí hay otra lista
No, no hay una forma "intrínseca" de saber que (por ejemplo) zap.co.it
es un subdominio (porque el registrador de Italia co.it
vende dominios como co.it
) mientras que zap.co.uk
no es (porque el registrador del Reino Unido NO vende dominios como co.uk
, pero solo como zap.co.uk
).
Simplemente tendrá que usar una tabla auxiliar (o fuente en línea) para decirle qué dominios de nivel superior se comportan de forma peculiar como los del Reino Unido y Australia; no hay forma de adivinar eso simplemente mirando la cadena sin ese conocimiento semántico adicional (por supuesto que puede cambie eventualmente, pero si puede encontrar una buena fuente en línea, esa fuente también cambiará en consecuencia, ¡uno espera! -).
Usando este archivo de tlds efectivos que alguien más encontró en el sitio web de Mozilla:
from __future__ import with_statement
from urlparse import urlparse
# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tld_file:
tlds = [line.strip() for line in tld_file if line[0] not in "//n"]
def get_domain(url, tlds):
url_elements = urlparse(url)[1].split(''.'')
# url_elements = ["abcde","co","uk"]
for i in range(-len(url_elements), 0):
last_i_elements = url_elements[i:]
# i=-3: ["abcde","co","uk"]
# i=-2: ["co","uk"]
# i=-1: ["uk"] etc
candidate = ".".join(last_i_elements) # abcde.co.uk, co.uk, uk
wildcard_candidate = ".".join(["*"] + last_i_elements[1:]) # *.co.uk, *.uk, *
exception_candidate = "!" + candidate
# match tlds:
if (exception_candidate in tlds):
return ".".join(url_elements[i:])
if (candidate in tlds or wildcard_candidate in tlds):
return ".".join(url_elements[i-1:])
# returns "abcde.co.uk"
raise ValueError("Domain not in global list of TLDs")
print get_domain("http://abcde.co.uk", tlds)
resultados en:
abcde.co.uk
Agradecería que alguien me diera a conocer qué partes de las anteriores podrían reescribirse de una manera más pitonica. Por ejemplo, debe haber una mejor manera de iterar sobre la lista last_i_elements
, pero no pude pensar en una. Tampoco sé si ValueError
es lo mejor para plantear. ¿Comentarios?
Usando python tld
https://pypi.python.org/pypi/tld
Instalar
pip install tld
Obtener el nombre de TLD como cadena de la URL dada
from tld import get_tld
print get_tld("http://www.google.co.uk")
co.uk
o sin protocolo
from tld import get_tld
get_tld("www.google.co.uk", fix_protocol=True)
co.uk
Obtener el dominio de nivel superior como un objeto
from tld import get_tld
res = get_tld("http://some.subdomain.google.co.uk", as_object=True)
res
# ''co.uk''
res.subdomain
# ''some.subdomain''
res.domain
# ''google''
res.tld
# ''co.uk''
res.fld
# ''google.co.uk''
res.parsed_url
# SplitResult(
# scheme=''http'',
# netloc=''some.subdomain.google.co.uk'',
# path='''',
# query='''',
# fragment=''''
# )
Obtener el nombre de dominio de primer nivel como cadena de la URL dada
from tld import get_fld
get_fld("http://www.google.co.uk")
# ''google.co.uk''