Tiempo atrás publiqué una forma de interactuar con formularios de páginas Web (ver).
Relacionado con este post y sobre todo con el del día anterior, donde necesitamos recuperar datos en una Table (de HTML) de una Web y llevarlos a nuestra hoja de Excel, expongo el siguiente artículo.
Es importante identificar en el código fuente de la Web el nombre o Id de la 'Table'.
Si accedemos a la Web en cuestión del ejemplo:
http://es.investing.com/indices/spain-35-components
y desde la Table presionamos botón derecho y Inspeccionar elemento, veremos el Id buscado:
En nuestro ejemplo la Table se identifica con el Id:"cr1", y así nos referiremos en el código de nuestra macro.
A continuación añadimos rótulos a nuestro encabezado en la hoja 'IBEX35', e incorporamos en la ventana de código de nuestro módulo incluimos el siguiente procedimiento:
Al lanzar la macro el resultado es:
Debemos tener mucha precaución, ya que la carga se realiza, según la Web, intercambiando los separadores decimales!!!.
En el código de más arriba se le da un tratamiento para que los números sean almacenados como números, empleando nuestro sistema de separadores.
Relacionado con este post y sobre todo con el del día anterior, donde necesitamos recuperar datos en una Table (de HTML) de una Web y llevarlos a nuestra hoja de Excel, expongo el siguiente artículo.
Es importante identificar en el código fuente de la Web el nombre o Id de la 'Table'.
Si accedemos a la Web en cuestión del ejemplo:
http://es.investing.com/indices/spain-35-components
y desde la Table presionamos botón derecho y Inspeccionar elemento, veremos el Id buscado:
En nuestro ejemplo la Table se identifica con el Id:"cr1", y así nos referiremos en el código de nuestra macro.
A continuación añadimos rótulos a nuestro encabezado en la hoja 'IBEX35', e incorporamos en la ventana de código de nuestro módulo incluimos el siguiente procedimiento:
Sub ImportarTableHTML_a_Excel() 'Tener REFERENCIA ACTIVA Microsoft Internet Controls !!! Dim IE As Object Dim fila As Integer, col As Integer Dim elemCollection As Object, curHTMLRow As Object Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.navigate ("http://es.investing.com/indices/spain-35-components") 'nos aseguramos que la web se ha descargado completamente While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE DoEvents Wend 'Limpiamos el rango destino de nuestra hoja de calculo ThisWorkbook.Sheets("IBEX35").Activate Range("A2:I36").ClearContents 'identificamos la Table, mediante su Id, para cargarla Set elemCollection = IE.Document.getElementById("cr1") ' Rows(0) sería el título de la tabla, por eso lo saltamos '(Ya tenemos nuestros rótulos) 'ahora recorremos todas las filas y columnas de la Table en HTML For fila = 1 To elemCollection.Rows.Length - 1 Set curHTMLRow = elemCollection.Rows(fila) For col = 0 To curHTMLRow.Cells.Length - 1 'llevamos los datos a nuestra hoja de cálculo Set celda = Sheets("IBEX35").Cells(fila + 1, col + 1) celda.Value = "'" & curHTMLRow.Cells(col).InnerText 'tratamos los valores numéricos como número... If IsNumeric(celda) Then celda.Value = Replace(celda.Value, ",", ".") Next col Next fila 'Cerramos Internet Explorer IE.Quit 'y limpiamos memoria Set IE = Nothing Set curHTMLRow = Nothing Set celda = Nothing End Sub
Al lanzar la macro el resultado es:
Debemos tener mucha precaución, ya que la carga se realiza, según la Web, intercambiando los separadores decimales!!!.
En el código de más arriba se le da un tratamiento para que los números sean almacenados como números, empleando nuestro sistema de separadores.
Como siempre!, un excelente lugar para conseguir recursos para excel!, yo utilicé esta información para extraer el precio de varios productos en la misma pagina con URL de productos variables, útil para comparar con mi Ecommerce sin la necesidad de ir producto por producto extrayendo los precios.
ResponderEliminarSiempre uso la info de esta blog pero nunca había escrito nada... quiero agradecerle a Ismael por toda la excelente información que nos ha aportado!
;-)
EliminarMuchas gracias a tí por tu comentario y por seguirme!!
Un saludo!
Buenos días Ismael, antes de nada felicitarte por la información. Si no es mucho pedir, te querría hacer una consulta, se podría invertir la tarea.?, me explico, estoy intentando validar todos los campos de una web, pero no consigo cumplimentar los distintos combobox que la Web tiene en su formulario.
EliminarComo podría hacerlo..?
Gracias
Hola JuanMa
Eliminarquizá este otro post te ayude...
https://excelforo.blogspot.com/2014/10/vba-rellenando-un-formulario-web-html.html
si bien ten presente que en ocasiones las web se 'capan' para evitar accesos no deseados de robots...
Saludos cordiales
Hola a todos:
EliminarEn esta fila (Set elemCollection = IE.Document.getElementById("10"))
me da el siguiente error: "Error en el método 'Document' de objeto 'IWebBrowser2'".
La tabla de la página web que estoy importando, al inspeccionar elemento sale solamente esto: table cellmargin="10"
No encuentro el ID de la tabla, sólo lo que les menciono.
Saludos.
Hola
Eliminaral indicar
Set elemCollection = IE.Document.getElementById("10")
estás buscando un elemento en el código de la web identificado con el Id = 10 de una Table
Tendrás que buscarlo.. a veces se identifica con otros parámetros de html y en lugar de
Set elemCollection = IE.Document.getElementById("10")
hay que buscar por name, etc... (hay varias formas)
En cualquier caso de alguna forma debe estar identificada...
Saludos
Amigo, entonces cómo puedo identificar la tabla? Este es el link, los datos están en el recuadro "SUMARIO":
Eliminarhttp://www.diariooficial.interior.gob.cl/edicionelectronica/empresas_cooperativas.php?date=20-03-2019&edition=42309
Ese es el link, al inspeccionar elemento, no encuentro donde está...
Hola
Eliminaryo probaría con
.getElementsByClassName('wrapsection')
aunque ten presente que en ocasiones no es posible...
Saludos
Hola
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminaralguna idea si la tabla no tiene id?
ResponderEliminar