Desde Power BI, en concreto desde Power Query, es posible recuperar información contenida en una tabla de una página html. Pero es frecuente que una tabla extensa esté paginada con lo que dificulta la obtención de toda la información. Para hacerlo podemos adoptar diferentes aproximaciones, pero una de ellas me parece la más sencilla y rápida para quienes no dominen mucho el lenguaje “M” que es el que utiliza Power Query.
La estrategia pasa por crear una función, encargada de recoger los datos de cada página contenida en la tabla web y una tabla que contendrá el resultado de cada consulta a cada una de las páginas. No es la mejor solución pues es necesario indicar el número de páginas a explorar, pero si es la más simple que he encontrado.
Para hacer un ejemplo he tomado la página de la Sociedad Española de Presas y Embalses (SEPREM) que dispone de un apartado con la lista paginada de embalses de España en la dirección http://www.seprem.es/presases.php. Al explorar los datos vemos que la lista de embalses está contenida en una tabla con 48 páginas. La página espera el parámetro «p» en la dirección que se corresponde al número de página que queremos visualizar, de manera que con la URL http://www.seprem.es/presases.php?p=24 accedemos a la página 24 y con la http://www.seprem.es/presases.php?p=48 a la última.
Desde Power BI vamos a «Get Data» y escogemos «Web» como conector de importación de datos. Se nos abre un diálogo donde poder introducir la URL de la página (http://www.seprem.es/presases.php en nuestro caso, aunque también podríamos poner http://www.seprem.es/presases.php?p=1).
Luego aparece una pantalla con la estructura de la página html en la parte de la izquierda con las diferentes tablas encontradas. Al observarlas vemos que la «Tabla 2» es la que contiene la información que nos interesa.
Aquí seleccionamos solo la «Tabla 2» y presionamos sobre «Edit». Nos aparece la tabla importada, aunque solo en su primera página. Esto nos servirá de plantilla para el código necesario. Una vez tengamos los registros a la vista deberemos presionar sobre «Advanced Editor».
Este código lo convertiremos en una función, con el fin de ser más pulcro, eliminamos una de las líneas que ahora aparece hasta dejar la función tal como aparece en la siguiente imagen.
Como podéis ver se ha cambiado la URL estática por una de variable:
Source = Web.Page(Web.Contents("www.seprem.es/presases.php?p="& Number.ToText(pagina))),
Es decir, concatenamos la URL con el string «?p=» y el número de página convertido a texto (con la función Number.ToText) puesto que lo hemos declarado como un número.
Esta función esperará que le pasemos un número, que se corresponde con el número de página de la tabla, y nos devolverá los datos. Si pinchamos en «Done» podremos probar la función invocáldola con un parámetro.
Una vez realizada la prueba eliminamos el resultado y para mayor claridad renombraremos la función, en nuestro caso la llamamos «TraeTabla»
La segunda parte de la solución pasa por crear una tabla a partir de una lista y utilizar los datos de la tabla como parámetro de la función que acabamos de crear. Para ello debemos hacer un nuevo «New Source» del tipo «Blank Query».
En la barra de fórmulas escribimos «={1..48}» generando así una lista.
Luego, en el apartado «Transform» presionamos sobre «To Table»
Para una mejor comprensión renombramos la columna, por ejemplo con el nombre «Pagina»
Ahora creamos una columna nueva con «Custom Column». Esta columna llamará a la función «TraeTabla» y como parámetro le pasará el valor de la columna «Pagina».
Lo que nos aparece es una tabla con dos columnas, la recien creada, que no hemos cambiado el nombre por defecto «Custom» contiene una tabla en cada celda, para abrir la tabla resultante presionar sobre el botón que aparece junto a una esquina de la cabecera de la columna.
De esta forma aparecen las siguientes opciones
Aceptamos con el botón «OK» y ya disponemos de una tabla con todos los resultados del origen de datos.
Solo queda realizar los retoques habituales: eliminar columnas no deseadas, cambiar el nombre de las cabeceras, sustituir valores o cambiar el tipo de datos.
Aquí tenéis de un video con la secuencia de acciones a realizar.