【发布时间】:2016-05-14 04:15:39
【问题描述】:
对于初学者来说,我绝不是 VBA 专家。只要知道足够危险 8)。
我开始搜索如何从网页中提取表格,发现很多人都问过同样的问题。不幸的是,我读到的大部分内容都超出了我的想象。我读到的一篇文章将我指向了 Siddharth Rout 的 detailed article,但是除了 Internet Explorer 或其他一些方法之外,我无法理解正在发生的事情。因为我只安装了 IE11 和 MS Office,所以我更愿意走 IE 路线。
我过去曾多次遇到此问题,并且总是放弃项目或手动完成。今天我想我会尝试学习如何做到这一点,并希望让我未来的生活更轻松一些。因此,我将使用来自游戏网站的数据,因为它模仿了我过去遇到的其他事情。
所以今天的(本周..不,本月..我是一个乐观主义者!)项目是建立一个参加锦标赛的每支球队的名单,并将他们的结果复制到 Excel 中。这类似于拉板球、曲棍球、棒球、足球或足球数据。我尝试使用 Excel 内置的从 Web 获取数据流程,但它无法识别网页上的表格。
网页地址为:http://worldoftanks.com/en/tournaments/1000000017/
在下图中
所以基础知识和我的出发点是简单地从 1 个组中提取团队列表并将其粘贴到没有格式的 Excel 页面中。基本上是上图中的黄色区域。图片无法放满整个页面,但该组实际上有 10 个团队。但是我想让它变得可变,因为有时你可能在一个小组中拥有多于或少于 10 个团队。在这一点上,我将假设行数是一个小问题。
一旦我弄清楚了那部分,我希望切换到下一个组会相对容易,获取团队和结果的列表并将它们添加到我在 excel 中构建的列表的末尾。在网页上,这将通过选择蓝色区域来完成。
现在,一旦我弄清楚了这两件事,我需要根据绿色锦标赛区域的阶段从头开始重新构建列表,并将该列表放在新页面上。我对如何实现这一点有一些想法,但这实际上取决于前两个步骤的样子。
我自己也有一个额外的任务,那就是拉出小组中每个团队的时间表,看看他们在与其他不同团队的比赛中表现如何。谁打败了谁类型的交易。我希望我能根据从上述任务中学到的信息弄清楚那部分。
所以我很确定还有其他语言/prgs 更适合手头的任务,但我想坚持我所拥有的......以及到目前为止我所知道的很少。所以我尝试了一些 VBA 代码并评论了我需要实现的目标。到目前为止,我想我已经打开了网页!并在 cmets 中构建了一些关于如何做一些事情的思考过程。
Sub GetTeamData()
Dim IE As Object
Dim roundcounter As Integer
Dim groupcounter As Integer
Dim TeamList As Variant
Dim WebAddress As String
Dim Number_of_rounds as Integer
Dim Number_of_Groups as Integer
'set webaddress of site to link to
WebAddress = "http://worldoftanks.com/en/tournaments/1000000017/"
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = True
.navigate (WebAddress)
End With
'What does this chunk of code do? Wait for webpage to finish loading?
While IE.readyState <> 4
DoEvents
Wend
'set initial parameters for loops. I am ok with hardcoding this for now.
Number_of_groups = 125
Number_of_rounds = 5
'start pulling teamdata
'For roundcounter = 1 To number_of_rounds
'select roundcounter on webpage
'for groupcounter = 1 to number_of_groups
'select groupcounter on webpage
'grab table of 6-10 teams (position, team name, battles, wins, losses, ties, and points)
'add table to TeamList
'next groupcounter
'paste TeamList to sheet roundcounter cell A1
'clear TeamList
'next roundcounter
'Next task
'based on results on how to pull group table date, pull individual team schedule results to build matrix result
Set IE = Nothing
End Sub
我正在考虑的一件事是,与其使用带有计数器的 for next 循环,不如将其设置为执行循环,直到发生错误(例如超过组数或轮数)会更容易。现在我在闲逛。
无论如何,如果有人能让我开始了解如何从上面的图片中拉出黄色区域,那将不胜感激!请温柔一点!我确实意识到这个问题已经被问过很多次了......我只是不明白我在读什么。另外,如果这不可能或很难做到,请告诉我。提前感谢您在教育我方面的帮助。
更新 16/03/19 0900
所以今天早上我再次尝试了从 Web 获取数据过程,运气好一点……但并不多。
在出现 1 个错误窗口后,我单击“是”以加载网页
我在页面的左上角出现了一次黄色小箭头。所以我试了一下,它确实提取了信息。
但我确实注意到我想要的桌子旁边没有黄色框,这让我怀疑它是否不是桌子。
当我确实提取信息时,这不是我正在寻找的信息。当我扫描结果时,我可以看到我要查找的数据应该在哪里,但是所有结果都丢失了,只有表格列标题出现在大约 263 行左右。
然后我尝试从网页上执行复制和粘贴方法,使用全选作为网页上的副本。对于粘贴,我尝试了不同的方法。保持源格式没有任何结果。保持目的地格式引入信息。我尝试粘贴特殊(html、Unicode 和文本)HTML 使事情看起来很漂亮,另外两个将所有内容放在一个列中。更重要的是,结果在表格中。
现在,如果我只需要第 1 轮第 1 组的团队列表和结果,我可以使用它。只需删除表格上方和下方的所有行,瞧!然而,由于每个组和每一轮的网址都是相同的,我不知道如何“点击”蓝色或绿色区域来更新信息。如果我知道这一点,我可以通过复制和粘贴每一页来自动化该过程,然后将结果编辑到表格中,然后将表格移动到最后结果下方的另一张表中。
对我来说似乎应该有更好的方法。
16/03/19 1600
<!-- ko if: visibleBracketType() === ROUND_ROBIN -->
<table class="tournament-table tournament-table__indent" cellpadding="0" cellspacing="0">
<tr class="tournament-table_tr">
<th class="tournament-table_th tournament-table_th__numb">#</th>
<th class="tournament-table_th">
<div class="tournament-table_ico-holder">
<span class="ico-team">Team</span>
</div>
<div class="tournament-table_heading-text">
Team
</div>
</th>
<th class="tournament-table_th">
<div class="tournament-table_ico-holder">
<span class="ico-battles">Battles</span>
</div>
<div class="tournament-table_heading-text">
Battles
</div>
</th>
<th class="tournament-table_th">
<div class="tournament-table_ico-holder">
<span class="ico-victory">Victories</span>
</div>
<div class="tournament-table_heading-text">
Victories
</div>
</th>
<th class="tournament-table_th tournament-table_th__mobile-hide">
<div class="tournament-table_ico-holder">
<span class="ico-flag">Defeats</span>
</div>
<div class="tournament-table_heading-text">
Defeats
</div>
</th>
<th class="tournament-table_th tournament-table_th__mobile-hide">
<div class="tournament-table_ico-holder">
<span class="ico-division">Draws</span>
</div>
<div class="tournament-table_heading-text">
Draws
</div>
</th>
<th class="tournament-table_th">
<div class="tournament-table_ico-holder">
<span class="ico-points">Points</span>
</div>
<div class="tournament-table_heading-text">
Points
</div>
</th>
</tr>
<!-- ko foreach: {data: rrBrackets().teams, as: 'team' } -->
<tr class="tournament-table_tr" data-bind="css: {'tournament-table_tr__my-team': team.team_id === $root.currentUserTeamIdInCurrentGroup()}">
<td class="tournament-table_td" data-bind="text: team.position"></td>
<td class="tournament-table_td" data-bind="css: {'tournament-table_td__my-team': team.team_id === $root.currentUserTeamIdInCurrentGroup()}">
<a class="tournament-table_team tournament-table_team__big" target="_blank" data-bind="text: team.team_title, attr: {href: $root.getTournamentTeamUrl(team.team_id)}"></a>
</td>
<td class="tournament-table_td" data-bind="text: team.battle_played"></td>
<td class="tournament-table_td" data-bind="text: team.wins"></td>
<td class="tournament-table_td tournament-table_td__mobile-hide" data-bind="text: team.losses"></td>
<td class="tournament-table_td tournament-table_td__mobile-hide" data-bind="text: team.draws"></td>
<td class="tournament-table_td" data-bind="text: team.extra_statistics.points"></td>
</tr>
<!-- /ko -->
</table>
好的,根据我从阅读的各种帖子和观看的视频中收集到的信息,我需要在网页编码中找到一些关键的“标签”,然后我最终可以开始提取数据.我在 IE 上按 F12 以查看代码,然后在代码区域中搜索了我正在查找的区域中的一些显示文本,并找到了上面的“代码”块。有了很多猜测,我希望我抓住了正确的部分。现在要弄清楚那个关键标签是什么以及如何使用它。顺便问一下,那个网页是什么代码?
【问题讨论】:
-
我也尝试按照example查看网页的源代码,但我无法对源代码进行正面或反面。
-
在您包含的代码 sn-p 中,它仍然是 HTML:
<tr><\tr>用于表行,<th><\th>用于表头,<td><\td>用于表数据/列。问题将是提取实际数据,因为它们是绑定的,您只能“读取”HTML 源代码。如果可以从页面的“查看源代码”中看到实际数据,则可以使用VBA读取数据。 -
谢谢罗文。这将有助于缩小我对使用 excel VBA 8 抓取 HTML 页面的数据的搜索范围。现在只有几千页要读!不过说真的,谢谢你,因为当我把标签放在 HTML 上时我才猜到它。
-
所以我不确定,如果我理解正确,但缺少的部分是单击正确的按钮?
-
不,我的代码正下方的粗线部分。如果我分解我想做的事情,这是主要关注点。这是从第一个屏幕截图中拉出黄色区域(数字和名称)。一旦我可以在人们的帮助下弄清楚该部分,次要部分将是单击以更改数据显示,以便我可以重复黄色区域的数据提取。如果我无法提取数据,那么点击就没有意义。这有助于澄清吗?