这将抓取该页面上的整个表格。
这个项目使用early-binding。您需要设置引用到:
- Microsoft Internet 控件
- Microsoft HTML 对象库
您可以在 VBE > 工具 > 参考中完成此操作。
我会说,这个网站在设置他们的表格时使用了一种非常奇怪的方法,找到一种体面的方法来完成这一点很有趣。
另外,您可能会或可能不会接受的另一件事是,此表中有 隐藏 列不会显示在网站上,但会显示在您的 Excel 文档中。如果您对此不满意,您可以在执行此代码后简单地删除或隐藏它们 - 或者如果您要修改它以防止在执行期间发生这种情况,那么您将获得更多权力。
Option Explicit
Sub rgnbateamstats()
Const url$ = "https://rotogrinders.com/team-stats/nba-earned?site=draftkings"
Dim IE As New InternetExplorer, doc As HTMLDocument
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
With IE
.Navigate url
.Visible = True
ieBusy IE
Set doc = .Document
End With
Dim r As Long, c As Long, tCol As HTMLDivELement
Dim subTbls(): subTbls = Array("rgt-bdy left", "rgt-bdy mid", "rgt-bdy right")
Dim subTbl As Long
For subTbl = 0 To 2
For Each tCol In getSubTblCols(doc, subTbls(subTbl)).getElementsByClassName("rgt-col")
c = c + 1
For r = 1 To tCol.getElementsByTagName("div").Length
ws.Cells(r, c) = tCol.getElementsByTagName("div")(r - 1).innerText
Next
Next tCol
Next subTbl
End Sub
Private Function getSubTblCols(doc As HTMLDocument, ByVal className$) As HTMLDivElement
Dim tbl As HTMLTable
Set tbl = doc.getElementById("proj-stats")
Set getSubTblCols = tbl.getElementsByClassName(className)(0).Children(0). _
Children(1)
End Function
Private Sub ieBusy(ieObj As InternetExplorer)
With ieObj
Do While .Busy Or .ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
End With
End Sub
好的,是时候试试这里发生了什么。
您的表格中有三个子表格。这是解释它的最佳方式,但这意味着您将首先使用以下行遍历每个子表:
For subTbl = 0 To 2
在该循环中,您将使用该行循环该子表的列:
For Each tCol In getSubTblCols(doc, subTbls(subTbl)).getElementsByClassName("rgt-col")
rgt-col 是每个表中列的类名 - 所以至少那部分很容易。函数getSubTblCols抓取数组subTbls()中子表的三个名称之一的主子表元素类名。
c 是您的 Excel 列号,r 是行号。您还为 HTML 的每个行号使用 r,但它使用 base 0,因此您必须减去 1。
然后使用单元格的innerText 属性获取单元格的值,将其放入电子表格中,然后冲洗并重复。
我已将您繁忙的网页功能移至新的子目录ieBusy。我还添加了.readyState 属性,因为正如我在my comment 中所述,.busy 本身充其量是不可靠的。