Páginas

viernes, 11 de agosto de 2017

Get Request con VBA Excel: Extrayendo definiciones desde la pagina web de la RAE

Hay algunas formas de extraer información desde una página web, la mas sencilla es por medio de un GET Request, que consiste en enviar una dirección modificada con los parámetros de la búsqueda.


Que pasa cuando hacemos click en el botón buscar de la pagina de búsquedas de la rae:









En el background el explorador envía una cadena de texto al servidor de la pagina, algo así como:






La parte hasta el signo de interrogación es la base para enviar todas las consultas a la pagina:





"w=" y "m=" son los campos del formulario que contienen los valores a consultar, de donde salen?



"w" es el atributo "name" del campo donde llenamos la palabra a buscar






"m" es el valor de la opción "exacta" en la lista desplegable.




Entonces en esta parte de la cadena de texto (o dirección web) que vamos a enviar el servidor, estamos especificando la palabra buscada y el tipo de definición:


http://dle.rae.es/srv/search?w=macro&m=30



Si quisieras buscar otras palabras, solo hay que actualizar el contenido de "w",  hagan la prueba pegándolas en la barra de direcciones y vean la pagina que se les devuelve:


http://dle.rae.es/srv/search?w=productividad&m=30
http://dle.rae.es/srv/search?w=programar&m=30
http://dle.rae.es/srv/search?w=programa&m=30


De ahí en adelante es cuestión de leer la pagina y extraer los datos como ya se ha hecho en estos posts:




El Codigo esta dividido en una subrutina que abre el explorador y pasa las palabras a una función que extrae su definición:


Sub buscar_definicion()
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    ie.Visible = False
    ie.Navigate "
http://dle.rae.es/"
   
   
    While ie.readyState <> READYSTATE_COMPLETE
        'Debug.Print ("Esperando carga de pagina")
    Wend
   
    Dim celda_palabra As Range
    Dim palabra As String
    For Each celda_palabra In Range("A2", "A11")
        palabra = celda_palabra.Value
        Debug.Print (palabra)
        celda_palabra.Offset(0, 1).Value = buscar_palabra(ie, palabra)
    Next
End Sub


Function buscar_palabra(ie As InternetExplorer, palabra As String)
    Dim pagina As HTMLDocument
    ie.Navigate "
http://dle.rae.es/srv/search?w=" & palabra & "&m=30"
   
    While ie.readyState <> 4
        Debug.Print ("Descargando pagina")
    Wend
   
    Set pagina = ie.document
   
    'chequea que exista un elemento <p> para comprobar que la pagina haya cargado
   
    Dim elemento_parrafo As HTMLParaElement
   
    While elemento_parrafo Is Nothing
        Set pagina = ie.document
        Set elemento_parrafo = pagina.getElementsByTagName("p")(0)
    Wend
       
   
    'chequea si el elemento p es definicion o no
    Dim parrafo As HTMLParaElement
   
    Set parrafo = pagina.getElementsByClassName("j")(0)
   
    If parrafo Is Nothing Then
        buscar_palabra = "Definicion no encontrada"
        Exit Function
    End If
   
    Dim parcial As Variant
    Dim texto_final As String
    texto_final = ""
    For Each parcial In parrafo.Children
        texto_final = texto_final & parcial.innerHTML & " "
    Next
      
    Debug.Print (texto_final)
    buscar_palabra = texto_final
   
   
End Function
























1 comentario:

  1. Hola, Buenos días... Copié el código tal cuál está en la página, pero al correr la macro todos los resultados (definiciones) aparecen como "Definición no encontrada); es decir, como si no se cumpliera la condición

    If parrafo Is Nothing Then
    buscar_palabra = "Definicion no encontrada"
    Exit Function
    End If

    ¿Podrían ayudarme?

    Muchas gracias...

    ResponderEliminar