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:
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