import gradio as gr import requests from newspaper import Article import base64 def extraer_info(url): if not url.strip(): return "[Error]: Por favor, ingresa una URL válida.", "

Sin imagen

" try: # Cabeceras simulando un navegador real para el HTML de la noticia headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "es-ES,es;q=0.9", "Referer": "https://www.google.com/" } # Descargamos el HTML de la noticia response = requests.get(url, headers=headers, timeout=15) if response.status_code != 200: return f"[Error del Servidor Web]: El sitio respondió con código {response.status_code}. Bloqueo Anti-Bot activo.", "

No se pudo cargar la noticia debido al bloqueo del sitio web.

" # Procesamos con newspaper3k articulo = Article(url, language='es') articulo.set_html(response.text) articulo.parse() titulo_y_texto = f"TÍTULO: {articulo.title}\n\n{articulo.text}" # --- BLOQUE SEGURO DE DESCARGA DE IMAGEN --- html_imagen = "" if articulo.top_image: try: # Modificamos el Referer para que parezca que estamos viendo la imagen desde el propio periódico headers_imagen = headers.copy() headers_imagen["Referer"] = url # Intentamos descargar la imagen img_response = requests.get(articulo.top_image, headers=headers_imagen, timeout=10) if img_response.status_code == 200: content_type = img_response.headers.get('content-type', 'image/jpeg') encoded_img = base64.b64encode(img_response.content).decode('utf-8') # --- SOLUCIÓN VISUAL PARA INTEGRACIÓN EN PANTALLA DE INICIO (iOS) --- html_imagen = f"""

📱 En iPhone: Mantén presionada la imagen para guardarla en tus Fotos

Imagen de la noticia
""" else: # Si da 403 o cualquier otro error, NO rompemos la app, damos una alternativa html_imagen = f"""

⚠️ Error {img_response.status_code} al descargar imagen

El servidor de la noticia bloqueó la descarga automatizada de la imagen, pero el texto se extrajo con éxito.

""" except Exception as e: # Si hay timeout o error de conexión en la imagen, la app sigue viva html_imagen = f"

⚠️ No se pudo previsualizar la imagen (Error de conexión).

" else: html_imagen = "

Este artículo no contiene una imagen principal.

" return titulo_y_texto, html_imagen except Exception as e: # Este catch solo atrapa errores graves del procesamiento de texto return f"[Error al extraer la información]: {str(e)}", "

Error crítico en el proceso

" # Interfaz Gráfica con gr.Blocks with gr.Blocks(title="Extractor de Noticias") as demo: gr.Markdown("## 📰 Extractor de Texto e Imagen de Noticias") gr.Markdown("Pega el enlace de un artículo para obtener su contenido limpio y la imagen principal.") with gr.Row(): with gr.Column(scale=2): url_input = gr.Textbox( label="URL de la noticia", placeholder="https://ejemplo.com/noticia", lines=1 ) btn_extraer = gr.Button("🚀 Extraer Contenido", variant="primary") gr.HTML(""" """) with gr.Column(scale=3): gr.Markdown("### Imagen principal") imagen_output = gr.HTML(value="

La imagen aparecerá aquí...

") texto_output = gr.Textbox( label="Texto e información extraída", lines=12, interactive=False, elem_id="texto_extraido" ) btn_extraer.click( fn=extraer_info, inputs=[url_input], outputs=[texto_output, imagen_output] ) demo.launch()