{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Práctica resuelta: extracción de restaurantes\n",
    "\n",
    "Esta práctica lee `restaurantes.html` con **BeautifulSoup**, extrae sus datos y crea dos archivos:\n",
    "\n",
    "- `restaurantes.csv`: una fila por restaurante.\n",
    "- `restaurantes.json`: restaurantes agrupados por sección."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. Extraer los restaurantes del HTML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Coger el contenido restaurantes.html\n",
    "from bs4 import BeautifulSoup\n",
    "with open(\"restaurantes.html\", \"r\", encoding=\"utf-8\") as file:\n",
    "    contenido = file.read()\n",
    "\n",
    "soup = BeautifulSoup(contenido, \"html.parser\")\n",
    "print(soup.prettify())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "secciones = soup.find_all(\"section\")\n",
    "restaurantes = []\n",
    "\n",
    "for seccion in secciones:\n",
    "    titulo_seccion = seccion.find(\"h2\").get_text(strip=True)\n",
    "\n",
    "    for tarjeta in seccion.find_all(\"div\", class_=\"restaurant\"):\n",
    "        imagen = tarjeta.find(\"img\")\n",
    "        contenido_restaurante = tarjeta.find(\"div\", class_=\"restaurant-content\")\n",
    "        enlace = contenido_restaurante.find(\"a\", class_=\"read-more\")\n",
    "\n",
    "        restaurante = {\n",
    "            \"seccion\": titulo_seccion,\n",
    "            \"nombre\": contenido_restaurante.find(\"h3\").get_text(strip=True),\n",
    "            \"descripcion\": contenido_restaurante.find(\"p\").get_text(strip=True),\n",
    "            \"imagen\": imagen.get(\"src\"),\n",
    "            \"texto_imagen\": imagen.get(\"alt\"),\n",
    "            \"enlace\": enlace.get(\"href\"),\n",
    "            \"titulo_enlace\": enlace.get(\"title\")\n",
    "        }\n",
    "\n",
    "        restaurantes.append(restaurante)\n",
    "\n",
    "restaurantes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Crear un fichero CSV con los datos extraidos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Se ha creado restaurantes.csv\n"
     ]
    }
   ],
   "source": [
    "import csv\n",
    "\n",
    "#creo csv\n",
    "with open(\"restaurantes.csv\", \"w\", encoding=\"utf-8-sig\", newline=\"\") as fichero:\n",
    "    campos = [\n",
    "        \"seccion\", \"nombre\", \"descripcion\", \"imagen\",\n",
    "        \"texto_imagen\", \"enlace\", \"titulo_enlace\"\n",
    "    ]\n",
    "    escritor = csv.DictWriter(fichero, fieldnames=campos)\n",
    "    escritor.writeheader()\n",
    "    escritor.writerows(restaurantes)\n",
    "\n",
    "print(\"Se ha creado restaurantes.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dac0dc9f",
   "metadata": {},
   "source": [
    "# 3. Crear un JSON con los datos extraidos\n",
    "\n",
    "Crear un fichero JSON con los datos extraidos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "05aa2ec5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Se ha creado restaurantes.json\n"
     ]
    }
   ],
   "source": [
    "import json\n",
    "\n",
    "with open(\"restaurantes.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(restaurantes, fichero, ensure_ascii=False, indent=4)\n",
    "\n",
    "print(\"Se ha creado restaurantes.json\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Crear un nuevo json con un nivel seccion y debajo sus restaurantes con sus datos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Se ha creado restaurantes.json\n"
     ]
    }
   ],
   "source": [
    "restaurantes_anidados = {}\n",
    "\n",
    "for restaurante in restaurantes:\n",
    "    seccion = restaurante[\"seccion\"]\n",
    "\n",
    "    datos_restaurante = {\n",
    "        clave: valor\n",
    "        for clave, valor in restaurante.items()\n",
    "        if clave != \"seccion\"\n",
    "    }\n",
    "\n",
    "    if seccion not in restaurantes_anidados:\n",
    "        restaurantes_anidados[seccion] = []\n",
    "\n",
    "    restaurantes_anidados[seccion].append(datos_restaurante)\n",
    "\n",
    "with open(\"restaurantes.json\", \"w\", encoding=\"utf-8\") as fichero:\n",
    "    json.dump(restaurantes_anidados, fichero, ensure_ascii=False, indent=4)\n",
    "\n",
    "print(\"Se ha creado restaurantes.json\")\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv (3.14.7.final.0)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.14.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
