Skip to content

Instantly share code, notes, and snippets.

@vollmann-ariel
Last active July 18, 2020 20:30
Show Gist options
  • Save vollmann-ariel/f709d6e104915f618f5f0365ab6ff5e1 to your computer and use it in GitHub Desktop.
Save vollmann-ariel/f709d6e104915f618f5f0365ab6ff5e1 to your computer and use it in GitHub Desktop.
Scraping Invertir Online.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Scraping Invertir Online.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/vollmann-ariel/f709d6e104915f618f5f0365ab6ff5e1/scraping-invertir-online.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "imfanf17fEkM",
"colab_type": "text"
},
"source": [
"# Web Scraping Invertir Online"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sfslsaWamAoO",
"colab_type": "text"
},
"source": [
"El siguiente código fué realizado con fines educativos para extraer valores de acciones en la bolsa a partir de la web de Invertir Online.\n",
"\n",
"Si bien el código no contempla iteraciones recomiendo tener la buena práctica de evitar saturar la conexión del server de esta excelente página incluyendo instrucciones como `sleep()` con una cantidad de segundos no menor a 60 entre consulta y consulta.\n",
"\n",
"El código es provisto sin garantía ni responsabilidad sobre el uso que se pudiera dar del mismo.\n",
"\n",
"Recomiendo SER RESPONSABLE Y RESPETUOSO."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yjx8WMbzfrXN",
"colab_type": "text"
},
"source": [
"### Descargamos la página"
]
},
{
"cell_type": "code",
"metadata": {
"id": "c0pKiQQode7l",
"colab_type": "code",
"colab": {}
},
"source": [
"import requests"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EZbCLXa3dfE0",
"colab_type": "text"
},
"source": [
"Usamos el método `.get()` para descargar el html."
]
},
{
"cell_type": "code",
"metadata": {
"id": "0wVJcLTYfF72",
"colab_type": "code",
"colab": {}
},
"source": [
"url = 'https://www.invertironline.com/mercado/cotizaciones/argentina'\n",
"\n",
"response = requests.get(url)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "SjZ7O93VdtsF",
"colab_type": "text"
},
"source": [
"Este objeto response nos da algunas informaciones:\n",
"- `response.text` -- el HTML devuelto (si hubiere)\n",
"- `response.status_code` -- un [código](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) para decirle si su solicitud fue exitosa (200 = Ok)."
]
},
{
"cell_type": "code",
"metadata": {
"id": "nz9wWNxyepNs",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "00f8d56c-8d34-4f24-9d9b-6ebc997bf07c"
},
"source": [
"response.status_code"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"200"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Bxragg2Ze1lo",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0cc452f3-93a1-44db-c9f1-cab916ae7671"
},
"source": [
"print(response.text[:200]) #Primeros 200 caracteres del HTML"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"\r\n",
"<!doctype html>\r\n",
"<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->\r\n",
"<!--[if lt IE 7]> <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"es\"> <![endif]-->\r\n",
"<!--[if IE 7]> \n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eimLlpdsJFrC",
"colab_type": "text"
},
"source": [
"Cargamos el html en la variable `page`"
]
},
{
"cell_type": "code",
"metadata": {
"id": "QL9ITc_QfL7S",
"colab_type": "code",
"colab": {}
},
"source": [
"page = response.text"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "P4eBpKvHf1-Y",
"colab_type": "text"
},
"source": [
"### Utilizando `requests` con `BeautifulSoup`"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "X1QgQNYj5n6r",
"colab_type": "text"
},
"source": [
"Ahora que tenemos el HTML, usamos `BeautifulSoup` para entender su estructura."
]
},
{
"cell_type": "code",
"metadata": {
"id": "9GBwRv8vf5Fz",
"colab_type": "code",
"colab": {}
},
"source": [
"from bs4 import BeautifulSoup as bs\n",
"soup = bs(page)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "MP1LOpbBDUW6",
"colab_type": "text"
},
"source": [
"`BeautifulSoup` ahora ha analizado el HTML, por lo que podemos buscar cosas como la etiqueta del encabezado por ejemplo:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "UrGeeocu7BrC",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "ef448a50-119e-44ac-83cf-215efdf1bb1b"
},
"source": [
"soup.find(class_='iol-font-headline3').text"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.google.colaboratory.intrinsic": {
"type": "string"
},
"text/plain": [
"'Cotización de Acciones Argentina - Panel Merval '"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vPjwyfJj_qZ3",
"colab_type": "text"
},
"source": [
"### Comenzamos a levantar la tabla"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JhzzPUhZQyNx",
"colab_type": "text"
},
"source": [
"Recuperamos los encabezados de la lista (después veremos que finalmente no los utilizo)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "80qNTf8ZYvmW",
"colab_type": "code",
"colab": {}
},
"source": [
"lista_de_encabezados = soup.find(attrs={'id':'cotizaciones'}).next.next.text.split('\\n') # Hay una forma más simple, pero es un ejercicio viejo y no tengo tiempo para analizarlo nuevamente\n",
"lista_de_encabezados = [each for each in lista_de_encabezados if each != '']\n",
"# lista_de_encabezados"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "UDDqBaoCfQC5",
"colab_type": "text"
},
"source": [
"Hacemos un iterable con todas las filas de la tabla."
]
},
{
"cell_type": "code",
"metadata": {
"id": "QuWRVQuAMOlJ",
"colab_type": "code",
"colab": {}
},
"source": [
"table_rows = soup.find(attrs={'id':'cotizaciones'}).find('tbody').findAll('tr')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "nR9NqhOSfOGL",
"colab_type": "text"
},
"source": [
"Buscamos las columnas dentro de la fila. Como muestra esta es la primera."
]
},
{
"cell_type": "code",
"metadata": {
"id": "PMa0FuqlfaaA",
"colab_type": "code",
"colab": {}
},
"source": [
"table_rows[1].find_all('td')[0]"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "_tbigZ61f9VC",
"colab_type": "text"
},
"source": [
"Para extraer el nombre del valor el método es el siguiente:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "UlGCYm00gGZS",
"colab_type": "code",
"colab": {}
},
"source": [
"print(table_rows[0].find_all('td')[0]['data-field'])\n",
"print(table_rows[0].find_all('td')[0].find('i')['title'])"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "kYXBMmXCgoLb",
"colab_type": "text"
},
"source": [
"Luego para extraer los demás valores de la tabla:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "74iqhCx3gxSy",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "405a9503-bd77-40a2-8898-e5cc9abdc8af"
},
"source": [
"print(table_rows[0].find_all('td')[1]['data-field'])\n",
"print(table_rows[0].find_all('td')[1]['data-order'])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"UltimoPrecio\n",
"36,700\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v92l6DXchM5E",
"colab_type": "text"
},
"source": [
"Así generamos finalmente este código para levantar la tabla completa."
]
},
{
"cell_type": "code",
"metadata": {
"id": "LW7aGdxbm0Xc",
"colab_type": "code",
"colab": {}
},
"source": [
"import string"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "5QsI-UBbRuYx",
"colab_type": "code",
"colab": {}
},
"source": [
"complete_table=[]\n",
"for row in table_rows:\n",
" row_data = {} #Usamos un diccionario, eso será útil más adelante para utilizar Pandas.\n",
" for column in row.find_all('td'):\n",
" try:\n",
" row_data[column['data-field']] = column['data-order']\n",
" except:\n",
" try:\n",
" row_data['Simbolo'] = ''.join([x for x in column.find('b').text if x not in [' ', '\\r', '\\n']])\n",
" row_data[column['data-field']] = column.find('i')['title']\n",
" except:\n",
" pass\n",
" complete_table.append(row_data) # Agregamos los diccionarios en una lista para ser utilizados con Pandas\n",
"complete_table"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-VV6Eiimip9j",
"colab_type": "text"
},
"source": [
"### Creamos el archivo y lo descargamos en formato excel"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZQS-jkQiEcmn",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "AtT07O1XKnCb",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 669
},
"outputId": "76514dfc-7401-4a91-d77b-7db2001a99cc"
},
"source": [
"complete_table_df = pd.DataFrame(complete_table)\n",
"complete_table_df"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Simbolo</th>\n",
" <th>IDTitulo</th>\n",
" <th>UltimoPrecio</th>\n",
" <th>Variacion</th>\n",
" <th>Apertura</th>\n",
" <th>Minimo</th>\n",
" <th>Maximo</th>\n",
" <th>UltimoCierre</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ALUA</td>\n",
" <td>Aluar</td>\n",
" <td>36,700</td>\n",
" <td>0,82</td>\n",
" <td>36,550</td>\n",
" <td>35,400</td>\n",
" <td>37,400</td>\n",
" <td>36,700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>BBAR</td>\n",
" <td>Bbva</td>\n",
" <td>158,750</td>\n",
" <td>2,25</td>\n",
" <td>154,900</td>\n",
" <td>150,000</td>\n",
" <td>159,000</td>\n",
" <td>158,750</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>BMA</td>\n",
" <td>Banco Macro</td>\n",
" <td>245,450</td>\n",
" <td>1,11</td>\n",
" <td>239,900</td>\n",
" <td>236,050</td>\n",
" <td>247,000</td>\n",
" <td>245,450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>BYMA</td>\n",
" <td>Bolsas Y Mercados Argentinos S.A.</td>\n",
" <td>428,000</td>\n",
" <td>1,41</td>\n",
" <td>425,000</td>\n",
" <td>411,500</td>\n",
" <td>430,000</td>\n",
" <td>428,000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>CEPU</td>\n",
" <td>Central Puerto Sa</td>\n",
" <td>29,950</td>\n",
" <td>0,67</td>\n",
" <td>30,100</td>\n",
" <td>29,150</td>\n",
" <td>30,450</td>\n",
" <td>29,950</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>COME</td>\n",
" <td>Sociedad Comercial del Plata</td>\n",
" <td>2,580</td>\n",
" <td>1,18</td>\n",
" <td>2,560</td>\n",
" <td>2,500</td>\n",
" <td>2,590</td>\n",
" <td>2,580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>CRES</td>\n",
" <td>Cresud</td>\n",
" <td>40,200</td>\n",
" <td>0,12</td>\n",
" <td>40,350</td>\n",
" <td>39,050</td>\n",
" <td>40,700</td>\n",
" <td>40,200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>CVH</td>\n",
" <td>Cablevisión Holding S.A.</td>\n",
" <td>456,500</td>\n",
" <td>-1,08</td>\n",
" <td>460,000</td>\n",
" <td>441,000</td>\n",
" <td>461,500</td>\n",
" <td>456,500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>EDN</td>\n",
" <td>Edenor</td>\n",
" <td>23,200</td>\n",
" <td>-1,69</td>\n",
" <td>23,400</td>\n",
" <td>22,500</td>\n",
" <td>23,550</td>\n",
" <td>23,200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>GGAL</td>\n",
" <td>Grupo Financiero Galicia</td>\n",
" <td>127,700</td>\n",
" <td>1,38</td>\n",
" <td>124,400</td>\n",
" <td>123,000</td>\n",
" <td>128,000</td>\n",
" <td>127,700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>MIRG</td>\n",
" <td>Mirgor</td>\n",
" <td>888,000</td>\n",
" <td>0,22</td>\n",
" <td>900,000</td>\n",
" <td>836,500</td>\n",
" <td>912,000</td>\n",
" <td>888,000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>PAMP</td>\n",
" <td>Pampa Energía</td>\n",
" <td>51,800</td>\n",
" <td>1,56</td>\n",
" <td>51,200</td>\n",
" <td>50,500</td>\n",
" <td>52,100</td>\n",
" <td>51,800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>SUPV</td>\n",
" <td>Grupo Supervielle S.A.</td>\n",
" <td>57,450</td>\n",
" <td>4,07</td>\n",
" <td>54,900</td>\n",
" <td>54,200</td>\n",
" <td>58,000</td>\n",
" <td>57,450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>TECO2</td>\n",
" <td>Telecom Argentina</td>\n",
" <td>207,450</td>\n",
" <td>0,82</td>\n",
" <td>206,000</td>\n",
" <td>202,250</td>\n",
" <td>209,000</td>\n",
" <td>207,450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>TGNO4</td>\n",
" <td>Transportadora Gas del Norte</td>\n",
" <td>41,000</td>\n",
" <td>-0,48</td>\n",
" <td>41,400</td>\n",
" <td>36,000</td>\n",
" <td>41,800</td>\n",
" <td>41,000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>TGSU2</td>\n",
" <td>Transportadora Gas del Sur</td>\n",
" <td>128,250</td>\n",
" <td>1,02</td>\n",
" <td>126,950</td>\n",
" <td>124,500</td>\n",
" <td>129,700</td>\n",
" <td>128,250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>TRAN</td>\n",
" <td>Transener</td>\n",
" <td>27,800</td>\n",
" <td>1,46</td>\n",
" <td>27,300</td>\n",
" <td>26,200</td>\n",
" <td>27,800</td>\n",
" <td>27,800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>TXAR</td>\n",
" <td>Ternium Argentina Sa</td>\n",
" <td>31,700</td>\n",
" <td>4,07</td>\n",
" <td>31,000</td>\n",
" <td>30,000</td>\n",
" <td>31,950</td>\n",
" <td>31,700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>VALO</td>\n",
" <td>Grupo Financiero Valores S.A.</td>\n",
" <td>26,250</td>\n",
" <td>0,95</td>\n",
" <td>26,300</td>\n",
" <td>26,150</td>\n",
" <td>26,600</td>\n",
" <td>26,250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>YPFD</td>\n",
" <td>YPF</td>\n",
" <td>708,850</td>\n",
" <td>4,27</td>\n",
" <td>681,000</td>\n",
" <td>670,000</td>\n",
" <td>710,000</td>\n",
" <td>708,850</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Simbolo IDTitulo ... Maximo UltimoCierre\n",
"0 ALUA Aluar ... 37,400 36,700\n",
"1 BBAR Bbva ... 159,000 158,750\n",
"2 BMA Banco Macro ... 247,000 245,450\n",
"3 BYMA Bolsas Y Mercados Argentinos S.A. ... 430,000 428,000\n",
"4 CEPU Central Puerto Sa ... 30,450 29,950\n",
"5 COME Sociedad Comercial del Plata ... 2,590 2,580\n",
"6 CRES Cresud ... 40,700 40,200\n",
"7 CVH Cablevisión Holding S.A. ... 461,500 456,500\n",
"8 EDN Edenor ... 23,550 23,200\n",
"9 GGAL Grupo Financiero Galicia ... 128,000 127,700\n",
"10 MIRG Mirgor ... 912,000 888,000\n",
"11 PAMP Pampa Energía ... 52,100 51,800\n",
"12 SUPV Grupo Supervielle S.A. ... 58,000 57,450\n",
"13 TECO2 Telecom Argentina ... 209,000 207,450\n",
"14 TGNO4 Transportadora Gas del Norte ... 41,800 41,000\n",
"15 TGSU2 Transportadora Gas del Sur ... 129,700 128,250\n",
"16 TRAN Transener ... 27,800 27,800\n",
"17 TXAR Ternium Argentina Sa ... 31,950 31,700\n",
"18 VALO Grupo Financiero Valores S.A. ... 26,600 26,250\n",
"19 YPFD YPF ... 710,000 708,850\n",
"\n",
"[20 rows x 8 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 17
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nSJxo2Yaljgp",
"colab_type": "text"
},
"source": [
"Generamos el excel a partir de la tabla de Pandas"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4YpVRYuNLprf",
"colab_type": "code",
"colab": {}
},
"source": [
"complete_table_df.to_excel('tabla_completa.xls', index= False)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "UaRjxJ9slaMQ",
"colab_type": "text"
},
"source": [
"Este desarrollo fue realizado en el Colab de Google, por lo que para descargar el archivo debemos hacer lo siguiente:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "xpYDtDlZLfrH",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "ca011f2c-69d9-4ea1-8ef9-8cd3a02cd33f"
},
"source": [
"from google.colab import files\n",
"files.download('tabla_completa.xls')"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_199c4a0e-8396-4587-9d27-007cafee313c\", \"tabla_completa.xls\", 9728)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment