如何从下表中格式化VBA中的数据
我试图从这个网页的首页到结束内容的所有表
使用下面的代码,我可以刮第1页的表格内容,但我不知道如何修改代码来获取从首页到结束的数据。
Option Explicit Sub NBAStats() Dim IE As Object, obj As Object Dim r As Integer, c As Integer, t As Integer Dim elemCollection As Object Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True .navigate ("http://stats.nba.com/league/player/#!/") While IE.ReadyState <> 4 DoEvents Wend Do While IE.busy: DoEvents: Loop ThisWorkbook.Sheet1.Clear Set elemCollection = IE.Document.getElementsByTagName("TABLE") For t = 0 To (elemCollection.Length - 1) For r = 0 To (elemCollection(t).Rows.Length - 1) For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1) ThisWorkbook.Worksheets(1).Cells(r + 1, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText Next c Next r Next t End With Set IE = Nothing End Sub
尝试find您正在抓取的网站的Sitemap.xml。 sitemap.xml填充了网页中的所有链接。
将该XML文件导入到您的Excel工作表,阅读每个链接并获取其中的每个表。
起初,在我看来,Internet Explorer的VBA自动化非常不稳定,在生产性用例中并不是真正可行的。 这也意味着从浏览器中提取的网站数据在生产性用例中并不真实。 如果您有权使用这些数据,那么您应该要求另一个数据源(例如XML
或JSON
)。 如果你没有资格,那么你不应该这样做。 可能该网站的提供者不同意这一点。
清楚的是,我正在谈论这样的网站,它只提供JavaScript
的数据。 如果数据将在HTML
那么您可以通过XMLHTTP
获取这些数据。 这是另一回事。
我会提供一个“解决scheme”。 所以你不能简单地认为“他根本无法做到这一点,所以他说你不应该那样做”。
因此,您必须分析网站并挑选可点击进行导航的元素。
Option Explicit Sub NBAStats() Dim IE As Object Dim r As Long, c As Long, t As Long, rSheet As Long, rStart As Long Dim bReady As Boolean Dim elementsTable As Object Dim elementsPageNavRigth As Object Dim elemPageNavRigth As Object Dim elementsTableDiv As Object ThisWorkbook.Worksheets(1).Cells.Clear Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True .navigate ("http://stats.nba.com/league/player/#!/") Do While IE.busy DoEvents Loop rSheet = 0 Do Do While elementsTableDiv Is Nothing Set elementsTableDiv = IE.Document.getElementsByClassName("table-responsive") DoEvents Loop Do While elementsTableDiv(0) Is Nothing DoEvents Loop Set elementsPageNavRigth = IE.Document.getElementsByClassName("page-nav right") Set elemPageNavRigth = elementsPageNavRigth(0) If elemPageNavRigth.className = "page-nav right disabled" Then bReady = True 'If rSheet = 0 Then rStart = 0 Else rStart = 1 Set elementsTable = elementsTableDiv(0).getElementsByTagName("TABLE") For r = rStart To (elementsTable(0).Rows.Length - 1) For c = 0 To (elementsTable(0).Rows(r).Cells.Length - 1) ThisWorkbook.Worksheets(1).Cells(r + rSheet + 1, c + 1) = elementsTable(t).Rows(r).Cells(c).innerText Next c Next r rSheet = rSheet + r If Not elemPageNavRigth Is Nothing Then elemPageNavRigth.Click Set elementsTableDiv = Nothing Loop Until bReady Or elemPageNavRigth Is Nothing End With Set IE = Nothing End Sub