.
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:
-
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.
-
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.).
-
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.
-
"""Docstring..."""
:
- La cadena de documentación explica la
función, su argumento y lo que devuelve.
-
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.
-
for url in lista_urls:
:
- Se inicia un bucle
for
para
iterar sobre cada URL en la lista_urls
.
-
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.
-
try...except:
:
- Se utiliza un bloque
try...except
para manejar posibles errores que puedan ocurrir al analizar una URL mal
formada.
-
parsed_url = urlparse(url)
:
- Dentro del bloque
try
, se
utiliza urlparse()
para analizar la URL en sus componentes.
-
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.).
-
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.".
-
partes_dominio = netloc.split('.')
:
- Se divide el
netloc
en partes
utilizando el "." como separador. Esto separará los subdominios, el nombre
de dominio principal y la extensión (por ejemplo, ["subdominio", "ejemplo",
"net"]).
-
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).
-
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.
-
dominios.append(...)
:
- El nombre de dominio extraído se añade
a la lista
dominios
.
-
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.
-
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.
-
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.