Necesitas obtener el favicon de un sitio web en un script de Python — quizá para una vista previa de enlace, un gestor de marcadores o un dashboard de monitorización. La buena noticia: no necesitas una herramienta pesada de automatización de navegador. Con unas pocas líneas usando requests y BeautifulSoup lo tendrás resuelto.

Este tutorial te muestra exactamente cómo escribir una función python get favicon from url que cubra los casos habituales. Veremos cómo parsear el HTML, cómo recurrir a /favicon.ico como fallback y cómo guardar el archivo binario.

Requisitos

Necesitas Python 3.7+ y dos librerías: requests y beautifulsoup4. Instálalas con pip:

pip install requests beautifulsoup4

Si prefieres no parsear HTML a mano, también puedes recurrir a una librería como favicon (disponible en PyPI), pero aquí lo construiremos desde cero para tener control total.

Paso 1: Descargar el HTML de la página

Empieza descargando el código fuente de la página. Usa un header User-Agent realista: algunos servidores bloquean las peticiones de Python por defecto.

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse

def get_favicon_url(page_url):
    headers = {'User-Agent': 'Mozilla/5.0 (compatible; FaviconFetcher/1.0)'}
    resp = requests.get(page_url, headers=headers, timeout=10)
    resp.raise_for_status()
    soup = BeautifulSoup(resp.text, 'html.parser')
    # ... continue below

Establece siempre un timeout. Sin él, un servidor lento puede dejar tu script colgado indefinidamente.

Paso 2: Buscar las etiquetas link rel="icon"

La especificación de HTML define rel="icon" como la forma estándar de declarar un favicon. Los navegadores también aceptan shortcut icon y apple-touch-icon. Los comprobaremos todos, dando preferencia a SVG y PNG frente a ICO.

    icon_link = soup.find('link', rel=lambda x: x and 'icon' in x.lower())
    if icon_link and icon_link.get('href'):
        return urljoin(page_url, icon_link['href'])
    # Fallback to /favicon.ico
    parsed = urlparse(page_url)
    return f'{parsed.scheme}://{parsed.netloc}/favicon.ico'

Fíjate en el uso de urljoin: los href de los favicons suelen ser relativos (por ejemplo, /assets/favicon.png) y necesitas resolverlos respecto a la URL de la página.

Paso 3: Descargar y guardar el icono

Una vez que tengas la URL, obtén el contenido binario y guárdalo en un archivo. Comprueba la cabecera Content-Type para elegir la extensión adecuada.

def download_favicon(favicon_url, output_path='favicon.ico'):
    headers = {'User-Agent': 'Mozilla/5.0 (compatible; FaviconFetcher/1.0)'}
    resp = requests.get(favicon_url, headers=headers, timeout=10)
    resp.raise_for_status()
    content_type = resp.headers.get('Content-Type', '')
    if 'png' in content_type:
        output_path = output_path.replace('.ico', '.png')
    elif 'svg' in content_type:
        output_path = output_path.replace('.ico', '.svg')
    with open(output_path, 'wb') as f:
        f.write(resp.content)
    return output_path

Esa es la lógica principal. Puedes envolver ambas funciones en un único script que tome una URL desde la línea de comandos.

Errores habituales

Si necesitas extraer varios formatos de iconos (Apple Touch, iconos del manifest), considera usar una herramienta dedicada como Mzu favicondl para inspeccionar todos los iconos disponibles. Para profundizar en los formatos de favicon, consulta nuestra guía de formatos de favicon.

Conclusión

Ahora ya dispones de una función en Python que funciona para obtener un favicon a partir de cualquier URL. Los pasos clave son: obtener la página, analizar las etiquetas <link>, resolver las URL relativas y descargar el binario. Gestiona los errores y los casos límite, y listo.

Recuerda respetar robots.txt y los límites de solicitudes cuando hagas scraping de muchos sitios. Para una solución completa para obtener favicons, consulta nuestro tutorial de PHP y compara las opciones.

Comprueba los requisitos documentados

El estándar HTML define rel='icon' como la relación de enlace para un icono que representa la página actual.