1 usuario conectado

Devolver sólo nombres de dominio en Python

Comparte esto

 
Escribe un código Python que tome una lista de URLs y devuelva una nueva lista que contenga solo los nombres de dominio (sin el "www." inicial ni la extensión ".com", ".es", etc.) de aquellas URLs que comiencen con "http://" o "https://".

.


Más ejercicios




Mostrar/Ocultar ejercicio resuelto


  Solución al Ejercicio: Devolver sólo nombres de dominio

📋 Copiar código


import re
from urllib.parse import urlparse

def extraer_dominios_http(lista_urls):
  """
  Toma una lista de URLs y devuelve una nueva lista con los nombres de dominio
  de aquellas URLs que comienzan con "http://" o "https://".

  Args:
    lista_urls: Una lista de cadenas de texto representando URLs.

  Returns:
    Una nueva lista de cadenas de texto con los nombres de dominio extraídos.
    Devuelve una lista vacía si no se encuentran URLs HTTP/HTTPS válidas.
  """
  dominios = []
  for url in lista_urls:
    if url.startswith("http://") or url.startswith("https://"):
      try:
        parsed_url = urlparse(url)
        netloc = parsed_url.netloc
        if netloc.startswith("www."):
          netloc = netloc[4:]  # Eliminar el "www." inicial
        partes_dominio = netloc.split('.')
        if len(partes_dominio) > 1:
          dominios.append('.'.join(partes_dominio[:-1]))  # Unir todas las partes excepto la última (la extensión)
        elif len(partes_dominio) == 1:
          dominios.append(partes_dominio[0]) # Si no hay extensión, añadir el nombre tal cual
      except:
        print(f"Error al procesar la URL: {url}")
  return dominios

# Ejemplo de uso
urls = [
    "https://www.google.com",
    "http://elpais.es",
    "ftp://ftp.example.com",
    "www.wikipedia.org",
    "https://subdominio.ejemplo.net",
    "http://mi-sitio",
    "https://blog.algomas.info/articulos",
    "mailto:alguien@example.com"
]

dominios_http = extraer_dominios_http(urls)
print(f"Lista de URLs original: {urls}")
print(f"Nombres de dominio (solo HTTP/HTTPS): {dominios_http}")

otras_urls = [
    "http://mi-web.local",
    "https://otra-pagina.online"
]

otros_dominios = extraer_dominios_http(otras_urls)
print(f"Otra lista de URLs: {otras_urls}")
print(f"Nombres de dominio (solo HTTP/HTTPS): {otros_dominios}")

Explicación del Código:

  1. import re:

    • Aunque no se usa directamente en la versión final del código, a menudo se utiliza re para trabajar con patrones en URLs. Se dejó la importación por si se quisiera refinar la extracción del dominio con expresiones regulares.
  2. from urllib.parse import urlparse:

    • Importa la función urlparse del módulo urllib.parse. Esta función es la forma estándar y segura de analizar URLs en Python, dividiéndolas en sus componentes (esquema, nombre de red, ruta, etc.).
  3. def extraer_dominios_http(lista_urls)::

    • Se define una función llamada extraer_dominios_http que toma una lista de cadenas de texto (lista_urls) como argumento.
  4. """Docstring...""":

    • La cadena de documentación explica la función, su argumento y lo que devuelve.
  5. dominios = []:

    • Se inicializa una lista vacía llamada dominios. Esta lista almacenará los nombres de dominio extraídos de las URLs HTTP/HTTPS válidas.
  6. for url in lista_urls::

    • Se inicia un bucle for para iterar sobre cada URL en la lista_urls.
  7. if url.startswith("http://") or url.startswith("https://")::

    • Se verifica si la URL actual comienza con "http://" o "https://". Solo se procesan las URLs que utilizan estos protocolos.
  8. try...except::

    • Se utiliza un bloque try...except para manejar posibles errores que puedan ocurrir al analizar una URL mal formada.
  9. parsed_url = urlparse(url):

    • Dentro del bloque try, se utiliza urlparse() para analizar la URL en sus componentes.
  10. netloc = parsed_url.netloc:

    • Se extrae el componente del "nombre de red" (netloc) de la URL analizada. Este componente generalmente contiene el nombre de dominio (y potencialmente subdominios, puerto, etc.).
  11. if netloc.startswith("www.")::

    • Se verifica si el netloc comienza con "www.". Si es así, se eliminan los primeros cuatro caracteres para obtener el nombre de dominio sin el "www.".
  12. partes_dominio = netloc.split('.'):

  1. if len(partes_dominio) > 1::

    • Si hay más de una parte después de la división (lo que indica que probablemente hay un nombre de dominio y una extensión), se unen todas las partes excepto la última con un "." para obtener el nombre de dominio principal (y posibles subdominios).
  2. elif len(partes_dominio) == 1::

    • Si solo hay una parte, se asume que es el nombre de dominio sin extensión y se añade tal cual.
  3. dominios.append(...):

    • El nombre de dominio extraído se añade a la lista dominios.
  4. except::

    • Si ocurre algún error durante el procesamiento de la URL (por ejemplo, si urlparse falla), se imprime un mensaje de error indicando la URL problemática.
  5. return dominios:

    • Después de procesar todas las URLs de la lista de entrada, la función devuelve la lista dominios con los nombres de dominio extraídos de las URLs HTTP/HTTPS válidas.

     

  6. Ejemplo de uso:

    • Se definen dos listas de URLs (urls y otras_urls) que contienen diferentes tipos de URLs (HTTP, HTTPS, FTP, sin protocolo, con subdominio, etc.).
    • Se llama a la función extraer_dominios_http con cada lista y el resultado se imprime, mostrando solo los nombres de dominio de las URLs HTTP/HTTPS.