使用VBA excel多个类名从网站拉取数据

我知道这已被问了很多次,但没有看到一个明确的答案循环通过一个div和findind标签具有相同的类名。

我的第一个问题:

如果我有这样的事情:

<div id="carousel"> <div id="images"> <div class="imageElement"> <img src="img/image1.jpg"> </div> <div class="imageElement"> <img src="img/image2.jpg"> </div> <div class="imageElement"> <img src="img/image3.jpg"> </div> </div> </div> 

所以我想把所有的img Src与div中的“images”一起放入imageElement类名中,并将它们复制到excel中的某些单元格中。

第二个问题:我已经看到了用VBA拉网站内容的两种方法,一种是使用IE,另一种是使用浏览器的代码。

 Private Sub pullData_Click() Dim x As Long, y As Long Dim htm As Object Set htm = CreateObject("htmlFile") With CreateObject("msxml2.xmlhttp") .Open "GET", "http://website.html", False .send htm.body.innerHTML = .responsetext End With End Sub 

第二种方法:

 Set ie = New InternetExplorer With ie .navigate "http://eoddata.com/stockquote/NASDAQ/AAPL.htm" .Visible = False While .Busy Or .readyState <> READYSTATE_COMPLETE DoEvents Wend Set objHTML = .document DoEvents End With Set elementONE = objHTML.getElementsByTagName("TD") For i = 1 To elementONE.Length elementTWO = elementONE.Item(i).innerText If elementTWO = "08/10/12" Then MsgBox (elementONE.Item(i + 1).innerText) Exit For End If Next i DoEvents ie.Quit DoEvents Set ie = Nothing 

哪一个更好,为什么?

所以,如果你能帮助我,我会感激。

先谢谢你。

您的第一个选项通常比较好,因为它比第二个方法快得多,它直接向Web服务器发送请求并返回响应。 这比自动化Internet Explorer(第二个选项)更有效率。 自动化IE浏览器非常慢,因为你实际上只是浏览网站 – 它将不可避免地导致更多的下载,因为它必须加载页面中的所有资源 – 图像,脚本,CSS文件等。它还将在页面上运行任何Javascript – 所有这一切通常没有用,你必须等待它完成parsing页面之前。

然而这是一把双刃剑 – 尽pipe慢得多,如果您不熟悉html请求,自动化Internet Explorer比第一种方法要容易得多,特别是当dynamic生成元素或者页面依赖于AJAX时。 当您需要访问需要您login的站点中的数据时,自动化IE也比较容易,因为它将为您处理相关的Cookie。 这并不是说第一种方法无法进行networking抓取,而是需要对networking技术和网站架构有更深入的了解。

第一种方法的更好的select是使用不同的对象来处理请求和响应,使用WinHTTP库比MSXML库提供更多的弹性,并且通常也会自动处理任何cookie。

至于parsing数据,在第一种方法中,您使用了后期绑定来创buildHTML对象(htmlfile),同时这减less了对引用的需求,同时也降低了function。 例如,在使用后期绑定时,如果用户安装了IE9,则缺less添加的function,特别是在这种情况下,getElementsByClass名称函数。

作为第三种select(以及我的首选方法):

 Dim oHtml As HTMLDocument Dim oElement As Object Set oHtml = New HTMLDocument With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", "http://www.someurl.com", False .send oHtml.body.innerHTML = .responseText End With For Each oElement In oHtml.getElementsByClassName("imageElement") Debug.Print oElement.Children(0).src Next oElement 'IE 8 alternative 'For Each oElement In oHtml.getElementsByTagName("div") ' If oElement.className = "imageElement" Then ' Debug.Print oElement.Children(0).src ' End If 'Next oElement 

这将需要Microsoft HTML Object Library的参考设置 – 如果用户没有安装IE9,将会失败,但这可以被处理,并且变得越来越不相关

将元素打印到单元格replace:

 For Each oElement In oHtml.getElementsByClassName("imageElement") Debug.Print oElement.Children(0).src Next oElement 

附:

 Dim wsTarget as Worksheet dim i as Integer i=1 set wsTarget=activeworkbook.worksheets("SomeSheet") For Each oElement In oHtml.getElementsByClassName("imageElement") wstarget.range("A" & i)=oElement.Children(0).src i=i+1 Next 

“更正了For的语法错误