Obtener subdominio de URL usando Python

Por ejemplo, la dirección es:

Address = http://lol1.domain.com:8888/some/page

Quiero guardar el subdominio en una variable para poder hacerlo así;

 print SubAddr >> lol1 

urlparse.urlparse dividirá la URL en protocolo, ubicación, puerto, etc. Luego, puede dividir la ubicación por . para obtener el subdominio.

 url = urlparse.urlparse(address) subdomain = url.hostname.split('.')[0] 

El paquete tldextract hace que esta tarea sea muy fácil, y luego puede usar urlparse como se sugiere si necesita más información:

 >> import tldextract >> tldextract.extract("http://lol1.domain.com:8888/some/page" ExtractResult(subdomain='lol1', domain='domain', suffix='com') >> tldextract.extract("http://sub.lol1.domain.com:8888/some/page" ExtractResult(subdomain='sub.lol1', domain='domain', suffix='com') >> urlparse.urlparse("http://sub.lol1.domain.com:8888/some/page") ParseResult(scheme='http', netloc='sub.lol1.domain.com:8888', path='/some/page', params='', query='', fragment='') 

Tenga en cuenta que tldextract maneja adecuadamente los subdominios.

Versión modificada de la respuesta fantástica aquí: Cómo extraer el nombre de dominio de nivel superior (TLD) de la URL

Necesitará la lista de tlds efectivos desde aquí.

 from __future__ import with_statement from urlparse import urlparse # load tlds, ignore comments and empty lines: with open("effective_tld_names.dat.txt") as tldFile: tlds = [line.strip() for line in tldFile if line[0] not in "/\n"] class DomainParts(object): def __init__(self, domain_parts, tld): self.domain = None self.subdomains = None self.tld = tld if domain_parts: self.domain = domain_parts[-1] if len(domain_parts) > 1: self.subdomains = domain_parts[:-1] def get_domain_parts(url, tlds): urlElements = urlparse(url).hostname.split('.') # urlElements = ["abcde","co","uk"] for i in range(-len(urlElements),0): lastIElements = urlElements[i:] # i=-3: ["abcde","co","uk"] # i=-2: ["co","uk"] # i=-1: ["uk"] etc candidate = ".".join(lastIElements) # abcde.co.uk, co.uk, uk wildcardCandidate = ".".join(["*"]+lastIElements[1:]) # *.co.uk, *.uk, * exceptionCandidate = "!"+candidate # match tlds: if (exceptionCandidate in tlds): return ".".join(urlElements[i:]) if (candidate in tlds or wildcardCandidate in tlds): return DomainParts(urlElements[:i], '.'.join(urlElements[i:])) # returns ["abcde"] raise ValueError("Domain not in global list of TLDs") domain_parts = get_domain_parts("http://sub2.sub1.example.co.uk:80",tlds) print "Domain:", domain_parts.domain print "Subdomains:", domain_parts.subdomains or "None" print "TLD:", domain_parts.tld 

Te dio:

 Dominio: ejemplo
 Subdominios: ['sub2', 'sub1']
 TLD: co.uk

Lo que está buscando está en: http://docs.python.org/library/urlparse.html

por ejemplo: ".".join(urlparse('http://www.my.cwi.nl:80/%7Eguido/Python.html').netloc.split(".")[:-2])

Hará el trabajo por usted (devolverá “www.my”)

Un enfoque muy básico, sin ningún tipo de control de cordura podría ser:

 address = 'http://lol1.domain.com:8888/some/page' host = address.partition('://')[2] sub_addr = host.partition('.')[0] print sub_addr 

Por supuesto, esto supone que cuando dices ‘subdominio’ te refieres a la primera parte del nombre de un host, por lo que en el siguiente caso, ‘www’ sería el subdominio:

http://www.google.com/

¿Es eso lo que quieres decir?

Para extraer el nombre de host, usaría urlparse de urllib2:

 >>> from urllib2 import urlparse >>> a = "http://lol1.domain.com:8888/some/page" >>> urlparse.urlparse(a).hostname 'lol1.domain.com' 

En cuanto a cómo extraer el subdominio, debe cubrir el caso de que el FQDN pueda ser más largo. Cómo hacer esto dependerá de sus propósitos. Podría sugerir quitar los dos componentes más a la derecha.

P.ej

 >>> urlparse.urlparse(a).hostname.rpartition('.')[0].rpartition('.')[0] 'lol1' 

Podemos usar https://github.com/john-kurkowski/tldextract para este problema …

Es fácil.

 >>> ext = tldextract.extract('http://forums.bbc.co.uk') >>> (ext.subdomain, ext.domain, ext.suffix) ('forums', 'bbc', 'co.uk')