¿Cómo analizo html sin crear un objeto de Internet Explorer en vba?

No tengo Internet Explorer en ninguna de las computadoras en el trabajo, por lo tanto, crear un objeto de Internet Explorer y usar ie.navigate para analizar el html y buscar las tags no es posible. Mi pregunta es, ¿cómo puedo extraer ciertos datos con una etiqueta automáticamente de un origen de fotogtwigs a mi hoja de cálculo sin usar IE? Ejemplo de código en las respuestas sería muy útil 🙂 Gracias

Puede usar XMLHTTP para recuperar el origen HTML de una página web:

Function GetHTML(url As String) As String With CreateObject("MSXML2.XMLHTTP") .Open "GET", url, False .Send GetHTML = .ResponseText End With End Function 

No sugeriría usar esto como una función de hoja de cálculo, de lo contrario la URL del sitio se volverá a consultar cada vez que se vuelva a calcular la hoja de cálculo. Algunos sitios tienen lógica para detectar raspaduras mediante llamadas frecuentes y repetidas, y su IP podría quedar prohibida , temporal o permanentemente, según el sitio.

Una vez que tenga la cadena HTML de origen (preferiblemente almacenada en una variable para evitar repeticiones innecesarias), puede usar funciones de texto básicas para analizar la cadena para buscar su etiqueta.

Esta función básica devolverá el valor entre la y :

 Public Function getTag(url As String, tag As String, Optional occurNum As Integer) As String Dim html As String, pStart As Long, pEnd As Long, o As Integer html = GetHTML(url) 'remove <> if they exist so we can add our own If Left(tag, 1) = "< " And Right(tag, 1) = ">" Then tag = Left(Right(tag, Len(tag) - 1), Len(Right(tag, Len(tag) - 1)) - 1) End If ' default to Occurrence #1 If occurNum = 0 Then occurNum = 1 pEnd = 1 For o = 1 To occurNum ' find start  beginning at 1 (or after previous Occurence) pStart = InStr(pEnd, html, "< " & tag & ">", vbTextCompare) If pStart = 0 Then getTag = "{Not Found}" Exit Function End If pStart = pStart + Len("< " & tag & ">") ' find first end  after start  pEnd = InStr(pStart, html, "", vbTextCompare) Next o 'return string between start  & end  getTag = Mid(html, pStart, pEnd - pStart) End Function 

Esto encontrará solo básicas, pero podría agregar / eliminar / cambiar las funciones de texto para adaptarlas a sus necesidades.

Ejemplo de uso:

 Sub findTagExample() Const testURL = "https://en.wikipedia.org/wiki/Web_scraping" 'search for 2nd occurence of tag: 

which is "Contents" : Debug.Print getTag(testURL, "

", 2) '...this returns the 8th occurence, "Navigation Menu" : Debug.Print getTag(testURL, "

", 8) '...and this returns an HTML containing a title for the 'Legal Issues' section: Debug.Print getTag("https://en.wikipedia.org/wiki/Web_scraping", "

", 4) End Sub

Cualquier persona que haya realizado algún raspado web estará familiarizada con la creación de una instancia de Internet Explorer (IE) y la navegación a una dirección web y una vez que la página esté lista comience a navegar por el DOM utilizando el tipo ‘Microsoft HTML Object Library’ (MSHTML) biblioteca. La pregunta es si IE no está disponible, qué hacer. Estoy en la misma situación para mi caja con Windows 10.

Sospeché que era posible girar una instancia de MSHTML.HTMLDocument independiente de IE, pero su creación no es obvia. Gracias al interlocutor por preguntar esto ahora. La respuesta está en el método MSHTML.IHTMLDocument4.createDocumentFromUrl . Uno necesita un archivo local para trabajar (EDITAR: ¡en realidad también se puede incluir una url webby!) Pero tenemos una bonita función de API de Windows llamada URLDownloadToFile para descargar un archivo.

Este código se ejecuta en mi caja de Windows 10 donde se ejecuta Microsoft Edge y no en Internet Explorer. Este es un hallazgo importante y gracias al que pregunta por haberlo planteado.

 Option Explicit '* Tools->Refernces Microsoft HTML Object Library '* MSDN - URLDownloadToFile function - https://msdn.microsoft.com/en-us/library/ms775123(v=vs.85).aspx Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _ (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Sub Test() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim sLocalFilename As String sLocalFilename = Environ$("TMP") & "\urlmon.html" Dim sURL As String sURL = "https://stackoverflow.com/users/3607273/s-meaden" Dim bOk As Boolean bOk = (URLDownloadToFile(0, sURL, sLocalFilename, 0, 0) = 0) If bOk Then If fso.FileExists(sLocalFilename) Then '* Tools->Refernces Microsoft HTML Object Library Dim oHtml4 As MSHTML.IHTMLDocument4 Set oHtml4 = New MSHTML.HTMLDocument Dim oHtml As MSHTML.HTMLDocument Set oHtml = Nothing '* IHTMLDocument4.createDocumentFromUrl '* MSDN - IHTMLDocument4 createDocumentFromUrl method - https://msdn.microsoft.com/en-us/library/aa752523(v=vs.85).aspx Set oHtml = oHtml4.createDocumentFromUrl(sLocalFilename, "") '* need to wait a little whilst the document parses '* because it is multithreaded While oHtml.readyState <> "complete" DoEvents '* do not comment this out it is required to break into the code if in infinite loop Wend Debug.Assert oHtml.readyState = "complete" Dim sTest As String sTest = Left$(oHtml.body.outerHTML, 100) Debug.Assert Len(Trim(sTest)) > 50 '* just testing we got a substantial block of text, feel free to delete '* page specific logic goes here Dim htmlAnswers As Object 'MSHTML.DispHTMLElementCollection Set htmlAnswers = oHtml.getElementsByClassName("answer-hyperlink") Dim lAnswerLoop As Long For lAnswerLoop = 0 To htmlAnswers.Length - 1 Dim vAnswerLoop Set vAnswerLoop = htmlAnswers.Item(lAnswerLoop) Debug.Print vAnswerLoop.outerText Next End If End If End Sub 

Gracias por preguntar esto.

PD. He utilizado TaskList para verificar que IExplore.exe no se crea debajo de los capós cuando se ejecuta este código.

PPS Si te gustó esto, ve más en mi blog de la plataforma de desarrollo de Excel