2011-08-03 19 views

Respuesta

14

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

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

Funciona muy bien. Lo usé como si Node = urlparse.urlparse (address) .hostname.split ('.') [0] – Marko

+3

¿Qué pasa si se trata de una dirección IP? ¿Y qué pasa si tiene un subdominio de segundo nivel? – naktinis

+1

Los subdominios pueden contener puntos múltiples por lo que 'api.test' también es válido, solo téngalo en cuenta. Si desea un buen paquete para hacer esto, consulte 'https: // pypi.python.org/pypi/tldextract'. – sidneydobber

0

Un enfoque muy básico, sin ningún tipo de cordura comprobación podría parecerse a:

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 se dice 'subdominio' quiere decir la primera parte de un nombre de host, por lo que en el siguiente caso, 'www' sería el subdominio:

http://www.google.com/

es eso lo que quiere decir?

0

para extraer el nombre de host, que haría uso de urlparse urllib2:

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

En cuanto a la manera de extraer el subdominio, es necesario cubrir para el caso de que no FQDN podría ser más largo. Cómo harías esto dependería de tus propósitos. Podría sugerir quitar los dos componentes más adecuados.

E.g.

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

Lo que buscas 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 para usted (volverá "www.my")

+1

Esto supone que el nombre de dominio principal tiene dos partes, que se caen en ciertos casos, p. '.co.uk' direcciones. Además del Reino Unido, Israel, Brasil y Japón tienen dominios formales de segundo nivel, y probablemente haya otros. –

+0

Mi respuesta se ocupa de este problema usando una lista de TLD válidos. – Acorn

5

Modificado versión de la respuesta fantástica aquí: How to extract top-level domain name (TLD) from URL

Tendrá la lista de dominios de nivel superior eficaces de here

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 

le ofrece:

 
Domain: example 
Subdomains: ['sub2', 'sub1'] 
TLD: co.uk 
+0

¡Un viejo pero bueno! – FredTheWebGuy

+0

mejor que esto. –

4

paquete tldextract hace esta tarea muy fácil, y luego se puede utilizar 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.

+0

Esta debería ser la respuesta. Gracias. –

Cuestiones relacionadas