python url parsing dns extract

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é se tldextract 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



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