excel - Excel从网站中提取多个表格
问题描述
我正在做一个项目来运行一些关于 NFL 球员统计数据的分析模型。我下面有一些代码,另一个用户传递给我。此代码获取我在 Sheet1 上名为“PlayerList”的链接列表,并为每个玩家创建一个新选项卡并获取他们的传球数据。所有链接都指向职业足球参考。我可以更改此代码以提取除四分卫以外的所有位置的所有必要数据。对于 QB,我想拉出传球统计表以及冲球和接球统计表。任何帮助将不胜感激。此处提供一些示例链接供参考:
https://www.pro-football-reference.com/players/R/RodgAa00.htm https://www.pro-football-reference.com/players/B/BreeDr00.htm
下面是代码:
Option Explicit
Public Sub GetInfo()
Di If InStr(links(link, 1), "https://") > 0 Then
Set html = GetHTMLDoc(links(link, 1))
Set hTable = html.getElementById("passing")
If Not hTable Is Nothing Then
playerName = GetNameAbbr(links(link, 1))
Set ws = AddPlayerSheet(playerName)
WriteTableToSheet hTable, ws
FixTable ws
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Public Function GetHTMLDoc(ByVal url As String) As HTMLDocument
Dim sResponse As String, html As New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
html.body.innerHTML = sResponse
Set GetHTMLDoc = html
End Function
Public Sub WriteTableToSheet(ByVal hTable As HTMLTable, ByVal ws As Worksheet)
Dim x As Long, y As Long
With hTable
For x = 0 To .Rows.Length - 1
For y = 0 To .Rows(x).Cells.Length - 1
If y = 6 Or y = 7 Then
ws.Cells(x + 4, y + 1).Value = Chr$(39) & .Rows(x).Cells(y).innerText
Else
ws.Cells(x + 4, y + 1).Value = .Rows(x).Cells(y).innerText
End If
Next y
Next x
End With
End Sub
Public Function GetNameAbbr(ByVal url As String)
Dim tempArr() As String
tempArr = Split(url, "/")
GetNameAbbr = Left$(tempArr(UBound(tempArr)), 6)
End Function
Public Function AddPlayerSheet(ByVal playerName As String) As Worksheet
Dim ws As Worksheet
If SheetExists(playerName) Then
Application.DisplayAlerts = False
ThisWorkbook.Worksheets(playerName).Delete
Application.DisplayAlerts = True
End If
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = playerName
Set AddPlayerSheet = ws
End Function
Public Function SheetExists(ByVal playerName As String) As Boolean
SheetExists = Evaluate("ISREF('" & playerName & "'!A1)")
End Function
Public Sub FixTable(ByVal ws As Worksheet)
Dim found As Range, numSummaryRows As Long
With ws
Set found = .Columns("A").Find("Career")
If found Is Nothing Then Exit Sub
numSummaryRows = .Cells(.Rows.Count, "A").End(xlUp).Row - found.Row
numSummaryRows = IIf(numSummaryRows = 0, 1, numSummaryRows + 1)
Debug.Print found.Offset(, 1).Resize(numSummaryRows, 30).Address, ws.Name
found.Offset(, 1).Resize(numSummaryRows, 30).Copy found.Offset(, 2)
found.Offset(, 1).Resize(numSummaryRows, 1).ClearContents
End With
End Subm html As New HTMLDocument, links(), link As Long, wsSourceSheet As Worksheet
Dim hTable As HTMLTable, ws As Worksheet, playerName As String
Set wsSourceSheet = ThisWorkbook.Worksheets("PlayerList")
Application.ScreenUpdating = False
With wsSourceSheet
links = .Range("C2:C" & .Cells(.Rows.Count, "C").End(xlUp).Row).Value
End With
For link = LBound(links, 1) To UBound(links, 1)
解决方案
您是否有理由需要使用 VBA 执行此操作?Excel 非常有能力导入组织良好的数据,例如该页面上的 [几个] 表。
在数据选项卡下,单击From Web
然后输入网站 URL。
接下来,您将选择所需的表。不要发疯 - 只得到你需要的,但你可以通过启用复选框来选择多个表。
解析和组织页面上的所有数据可能需要几分钟的时间...
回到工作表后,您会在右侧看到查询。右键单击查询并选择Load To...
,然后选择Table
表数据的位置。您可以自定义大量其他属性;有一些教程描述了你可以做什么。
更多要自定义的内容隐藏在两个功能区选项卡中,仅当您单击表格时才会出现设计和查询。
我认为还有一种方法可以创建玩家列表,然后Advanced
在输入 URL 时使用该选项以允许您动态选择所需的任何玩家,同时只添加一次表格......但我从来没有想过那部分还没出来。
我不是体育迷,但我认为数据会在整个赛季中发生变化,使用这样的表格的一个好处是,一旦您按照自己的方式设置工作表,您可以选择自动设置一些设置 -每次打开工作簿时更新,或按计划更新,或手动更新,或从不更新;任何合适的。
谷歌“ Excel 网络查询”以了解更多关于使用查询(又名:“获取和转换”)提取和组织数据时可用的选项。
也许这可以作为替代方案来考虑,而不是已经内置在 Excel 中的编码功能。
祝你好运,“去运动!”
推荐阅读
- python - 如何使用 Python 捕获扩展循环的第一个元素?
- android - 导航到目的地的弹出片段
- neo4j - 在 Neo4j 中加载 csv,并将节点和关系放在一个 csv 文件中
- r - 错误:R Studio 的 Google 授权“暂时禁用登录”
- business-process-management - Camunda:如何在没有指示的情况下重新启动过程
- mysql - MYSQL:我应该在这里使用什么样的连接?
- arrays - 如何在 vuejs/vuetify 中显示路径在 json fake server 中的图像?
- apache-kafka - KafkaTemplate 用于 Spring-Kafka 中的死信处理程序
- c++ - Mingw32-make 失败并出现“找不到路径”错误
- cuda - 与 cuda 合作组的僵局