Python urlparse – extrae el nombre de dominio sin subdominio

Necesita una forma de extraer un nombre de dominio sin el subdominio de una url usando Python urlparse.

Por ejemplo, me gustaría extraer "google.com" de una URL completa como "http://www.google.com" .

Parece que el atributo urlparse es el más cercano al que puedo llegar con urlparse , pero eso incluye el subdominio, que en este ejemplo sería www.google.com .

Sé que es posible escribir alguna manipulación de cadena personalizada para convertir www.google.com en google.com, pero quiero evitar las transformaciones de cadenas o expresiones regulares a mano en esta tarea. (La razón de esto es que no estoy lo suficientemente familiarizado con las reglas de formación de url para sentirme seguro de que podría considerar cada caso límite requerido al escribir una función de análisis personalizada).

O, si urlparse no puede hacer lo que necesito, ¿alguien sabe alguna otra biblioteca de análisis de URL de Python que lo haría?

Probablemente quieras revisar tldextract , una biblioteca diseñada para hacer este tipo de cosas.

Utiliza la Lista de sufijos públicos para tratar de obtener una división decente basada en gTLD conocidos, pero tenga en cuenta que esto es solo una lista de fuerza bruta, nada especial, por lo que puede quedar desactualizado (aunque es de esperar que esté curado para no hacerlo). ).

 >>> import tldextract >>> tldextract.extract('http://forums.news.cnn.com/') ExtractResult(subdomain='forums.news', domain='cnn', suffix='com') 

Así que en tu caso:

 >>> extracted = tldextract.extract('http://www.google.com') >>> "{}.{}".format(extracted.domain, extracted.suffix) "google.com" 

Esta es una actualización, basada en la solicitud de recompensa para una respuesta actualizada

Comience usando el paquete tld . Una descripción del paquete:

Extrae el dominio de nivel superior (TLD) de la URL dada. La lista de nombres de TLD se toma de Mozilla http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1

 from tld import get_tld from tld.utils import update_tld_names update_tld_names() print get_tld("http://www.google.co.uk") print get_tld("http://zap.co.it") print get_tld("http://google.com") print get_tld("http://mail.google.com") print get_tld("http://mail.google.co.uk") print get_tld("http://google.co.uk") 

Esto produce

 google.co.uk zap.co.it google.com google.com google.co.uk google.co.uk 

Tenga en cuenta que maneja correctamente los TLD a nivel de país al dejar co.it y co.it , pero elimina adecuadamente los subdominios www y mail para .com y .co.uk

La llamada update_tld_names() al principio del script se usa para actualizar / sincronizar los nombres tld con la versión más reciente de Mozilla.

Esta no es una descomposición estándar de las URL.

No puedes confiar en el www. Estar presente u opcional. En muchos casos no lo hará.

Entonces, si quiere asumir que solo los dos últimos componentes son relevantes (lo que tampoco funcionará para el Reino Unido, por ejemplo, www.google.co.uk ), puede hacer una split('.')[-2:] .

O, que en realidad es menos propenso a errores, elimine un www. prefijo.

Pero de cualquier manera no puedes asumir que el www. es opcional, porque NO funcionará siempre!

Aquí hay una lista de sufijos comunes para los dominios. Puedes intentar mantener el sufijo + un componente.

https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

Pero, ¿cómo piensa manejar, por ejemplo, los dominios first.last.name ? ¿Supongamos que todos los usuarios con el mismo apellido son la misma empresa? Inicialmente, solo podría obtener dominios de tercer nivel allí. Por ahora, aparentemente también puedes obtener un segundo nivel. Entonces para .name no hay una regla general.

Para la manipulación de nombres de dominio, también puede usar Dnspy

Ayuda a extraer dominios (y tags de dominio) en varios niveles, utilizando una copia nueva de la lista de sufijo público de Mozilla.

El uso de tldexport funciona bien, pero aparentemente tiene un problema al analizar el subdominio blogspot.com y crear un desastre. Si desea continuar con esa biblioteca, asegúrese de implementar una condición if o algo así para evitar devolver una cadena vacía en el subdominio.

 from tld import get_tld from tld.utils import update_tld_names update_tld_names() result=get_tld('http://www.google.com') print 'https://'+result 

Entrada: http://www.google.com

Resultado: google.com

Hay varios módulos de Python que encapsulan la (una vez Mozilla) lista pública de sufijos en una biblioteca, varios de los cuales no requieren que la entrada sea una URL. A pesar de que la pregunta se refiere específicamente a la normalización de la URL, mi requisito era manejar solo los nombres de dominio, por lo que estoy ofreciendo una respuesta tangencial para eso.

Los méritos relativos de publicsuffix2 sobre publicsuffixlist o publicsuffix no están claros, pero todos parecen ofrecer la funcionalidad básica.

publicsuffix2:

 >>> import publicsuffix # sic >>> publicsuffix.PublicSuffixList().get_public_suffix('www.google.co.uk') u'google.co.uk' 
  • Supuestamente más fácil de empaquetar tenedor de publicsuffix .

publicsuffixlist:

 >>> import publicsuffixlist >>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk') 'google.co.uk' 
  • idna soporte de idna , que sin embargo no he probado.

publicsuffix:

 >>> import publicsuffix >>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk') 'google.co.uk' 
  • El requisito de manejar las actualizaciones y el almacenamiento en caché del archivo descargado es una complicación.