jueves, 21 de enero de 2021

Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF

Un grupo de funciones muy interesantes para interactuar con la www son las funciones Web. Especialmente cuando la web sobre la que trabajamos contiene información en HTML o bien en XML(Extensible Markup Language)... preferiblemente. Ya que para nuestro propósito necesitamos una estrucutra muy clara de lenguaje con etiquetas.
Si estas familiarizado con estos lenguajes entenderás muy rápido el sentido de estas funciones...

Pero vamos por partes.

Lo primero será acceder al contenido de una web. En mi ejemplo a datos del Gobierno de España (información pública y accesible por todo el mundo) a través de su web: datos.gob.es.
En concreto listaremos las provincas españolas. La URL completa que necesitaremos es:
https://datos.gob.es/apidata/nti/territory/Province.xml?_pageSize=100&_page=0&_sort=label

Escribimos entonces en A1 esa dirección, y en A2 la función:
=SERVICIOWEB(A1)
y obtendríamos en nuestra celda el código XML completo de esa dirección:
Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF

Es decir, tenemos información identificada y clasificada por etiquetas... lo cual nos facilitará encontrar el patrón necesario para recuperar ciertos datos... por ejemplo, los nombres de las provincias españolas, las cuales están etiquetadas por el nombre <label>

Y aquí entra la siguiente función: XMLFILTRO
XMLFILTRO(xml, xpath)
que especificamente requiere un código XML (aunque un HTML igualmente lo trabajaría correctamente); y como segundo argumento la 'ruta' o niveles de las etiquetas, cuya información, nos interesa.
Ten presente que en estos tipos de lenguajes las etiquetas se anidan o embeben en distintos niveles unos dentro de otros...

A partir del código anterior, puesto que queremos recuperar las provincias, emplearemos la etiqueta <label> como ya comentamos. En A4 insertamos: =XMLFILTRO(A2;"//label")
Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF

Fíjate en la forma del segundo argumento:
'//label'
donde indicamos busque de forma absoluta cualquier label... Si existieran otras 'label' dentro de otros niveles, necesitaríamos ser más precisos con la secuencia, por ejemplo:
=XMLFILTRO(A2;"//items/item/label")

Otra posibilidad que nos ofrece la función XMLFILTRO es recuperar el atributo de una etiqueta. Muy interesante!.
Supongamos tenemos esta URL en A1:
https://datos.gob.es/apidata/catalog/theme.xml?_sort=notation&_pageSize=100&_page=0
Al aplicar sobre ella la función SERVICIOWEB en A2:
=SERVICIOWEB(A1)
y sobre A2, en la celda A4 la función XMLFILTRO con la siguiente forma:
=XMLFILTRO(A2;"//items/item[1]/prefLabel/item/@lang")
Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF

Con el formato de ruta:
'//items/item[1]/prefLabel/item/@lang'
conseguimos referirnos exclusivamente a la primera etiqueta de <item> dentro de la etiqueta general de <items>
Además para identificar el atributo 'lang' emplearemos la arroba @
@lang
listando por tanto solo los idiomas contenidos en nuestro 'item'.

Por tanto, no solo recuperamos un atributo de etiqueta, si no que personalizamos de qué etiqueta en concreto!!.

Si quisieramos recuperar información de las direcciones web contenidas en nuestro anterior código XML de la URL:
https://datos.gob.es/apidata/catalog/theme.xml?_sort=notation&_pageSize=100&_page=0
nuestra fórmula en A4 podría ser:
=XMLFILTRO(A2;"//items/item/@href")
Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF

Donde comprobamos como el resultado es el listado de los atributos 'href' de las eiquetas de 'item'.

Si solo necesitamos la dirección web del segundo item, de 'Comercio', nuestra fórmula en A4 sería:
=XMLFILTRO(A2;"//items/item[2]/@href")
Funciones Web: SERVICIOWEB, XMLFILTRO y URLCODIF


Y un truco sorprendente para recuperar la última posición es emplear entre corchetes la instrucción [last](). Por ejemplo:
=XMLFILTRO(A2;"//items/item[last()]/@href")
o la penúltima posición:
=XMLFILTRO(A2;"//items/item[last()-1]/@href")

Por último hablaremos brevemente de la función URLCODIF que retornará cadenas de texto codificada como exigen los navegadores, convirtiendo todo tipo de caracteres no válidos a caracteres legibles y listos para usar por las URL.
Esto nos permite dinamizar algunas partes de nuestras URL.
Por ejemplo en A1 escribimos un número. Y en A2 escribimos:
=SERVICIOWEB("https://datos.gob.es/apidata/catalog/theme.xml?_sort=notation&_pageSize="&URLCODIF(A1)&"&_page=0")
Esto permite 'parametrizar' nuestra búsqueda sin peligro de error al usar caracteres no válidos.
Es por esto que recomiendo usar la función URLCODIF junto con la función SERVICIOWEB, lo que garantiza el uso de un URL válido en el momento de acceder cualquier servicio web.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.