html – 从可能未格式化为表格的网页中提取数据

对于初学者来说,我绝不是VBA的专家.只知道足够危险8).

我开始搜索如何从网页中提取表格,并看到许多人提出了同样的问题.不幸的是,我读到的大多数东西都在我头上.我读过的一篇文章由Siddharth Rout向我指出了这个detailed article,但是我无法跟踪除了有两种方法Internet Explorer或其他方法之外发生的事情.由于我只安装了IE11和MS Office,我宁愿选择IE路由.

我过去曾多次遇到过这个问题,并且总是放弃项目或手动完成任务.今天我想我会尝试学习如何做到这一点,希望我的未来生活有点容易.因此,我将使用来自游戏网站的数据,因为它模仿我过去遇到的其他事情.

所以今天(本周的……本月没有…我是一个乐观主义者!)项目是建立一个参与锦标赛的每个团队的清单,并将他们的结果复制到excel中.这类似于拉板球,曲棍球,棒球,足球或足球统计数据.我尝试使用Excel内置的Get Data From Web流程,但它没有识别网页上的表格.

网页的地址是:http://worldoftanks.com/en/tournaments/1000000017/

并在下图中

Web Page Example

所以基础和我的出发点是简单地从1组中拉出团队列表并将其粘贴到没有格式的excel页面中.基本上是上图中黄色的区域.图像无法适应整个页面,但实际上该组中有10个团队.但是我想让它变量,因为有时你可能在一个组中有多于或少于10个团队.我将假设行数在这一点上是一个小问题.

一旦我弄清楚那部分,我希望切换到下一组相对容易,抓住团队和结果列表,并将它们添加到我在excel中构建的列表的末尾.在网页上,这将通过选择蓝色区域来完成.

现在,一旦我弄清楚这两件事,我就需要根据绿色锦标赛区域的阶段从头开始再次构建列表,并将该列表放在新页面上.我有一些想法如何实现这一点,但它将真正取决于前两个步骤的样子.

我也有自己的奖金任务,就是为每个团队拉出一个团队的时间表,看看他们如何对抗其他各个团队.谁击败谁打字交易.我希望我可以根据从上述任务中学到的信息来确定这一部分.

所以我很确定还有其他语言/ prgs更适合手头的任务,但我想坚持我所拥有的……以及迄今为止我知道的一点点.所以我尝试了一些VBA代码并评论了我需要实现的目标.到目前为止,我想我已经打开了网页!并在评论如何做一些事情时建立了一个思考过程.

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

我想到的一件事是,不是使用带有计数器的下一个循环,而是更容易将其设置为循环,直到发生错误,例如超过组或轮数.现在我在散步.

无论如何,如果有人会如此友善,让我开始如何从上面的图像拉黄色区域,将非常感激!请温柔!我确实已经意识到这个问题已被问过很多次……我只是不明白我在读什么.如果这不可能或极难做,请告诉我.提前感谢您的帮助,教育我.

更新16/03/19 0900

所以我今天早上再次尝试了Get Data From Web流程,但运气更多……但并不多.

Get From Web

在1个错误窗口之后,我单击是以获取要加载的网页

error window on load

我在左上角的页面上显示了一个小黄色箭头.所以我试了一下它确实提供了信息.

Get From Web tick box

但我确实注意到我想要的桌子旁边没有黄色的盒子,这让我想知道它是不是桌子.

enter image description here

当我输入信息时,这不是我要找的信息.当我浏览结果时,我可以看到我要查找的数据应该在哪里,但是所有结果都丢失了,只有表格列标题显示在约263行左右.

web querry results

然后,我尝试从网页上使用select all for the page在网页上进行复制和粘贴方法.对于粘贴我尝试了不同的方法.保持源格式化没有任何结果.保持目的地格式带来信息.我尝试粘贴特殊(html,Unicode和文本)HTML使得外观看起来很漂亮,另外两个将所有内容放在一个列中.更重要的是,结果列在表中.

copy paste results

现在,如果我只需要第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来查看代码,然后在代码区域中我搜索了我正在查找的区域中的一些显示文本,并找到了上面的“代码”块.有很多GUESSING我希望我抓住了正确的大块.现在来弄清楚那个关键标签是什么以及如何使用它.顺便问一下,该网页的代码是什么?

解决方法

因此,如果我写了一个小Sub,我认为如果我理解正确,我认为应该解决你的问题.当然,你会投入一些工作,因为它现在只读一个阶段.但它从每个组读取数据:

Option Explicit

Private Sub CommandButton1_Click()

'make sure you add references to Microsoft Internet Controls (shdocvw.dll) and
 'Microsoft HTML object Library.
 'Code will NOT run otherwise.

Dim objIE As SHDocVw.InternetExplorer 'microsoft internet controls (shdocvw.dll)
Dim htmlDoc As MSHTML.HTMLDocument 'Microsoft HTML Object Library
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection

Set objIE = New SHDocVw.InternetExplorer

Dim htmlCurrentDoc As MSHTML.HTMLDocument 'Microsoft HTML Object Library

Dim RowNumber As Integer
            RowNumber = 1

With objIE
    .Navigate "http://worldoftanks.com/en/tournaments/1000000017/" ' Main page
    .Visible = 0
    Do While .READYSTATE <> 4: DoEvents: Loop
        Application.Wait (Now + TimeValue("0:00:01"))


        Set htmlDoc = .document

        Dim ButtonRoundData As Variant
        Set ButtonRoundData = htmlDoc.getElementsByClassName("group-stage_link")

        Dim ButtonData As Variant
        Set ButtonData = htmlDoc.getElementsByClassName("groups_link")



        Dim button As HTMLLinkElement
        For Each button In ButtonData

           Debug.Print button.nodeName

            button.Click

               Application.Wait (Now + TimeValue("0:00:02")) ' This is to prevent double entryies but it is not clean. you should definitly check if the table is still the same and wait then

            Set htmlCurrentDoc = .document
            Dim RawData As HTMLTable
            Set RawData = htmlCurrentDoc.getElementsByClassName("tournament-table tournament-table__indent")(0)



            Dim ColumnNumber As Integer
            ColumnNumber = 1

            Dim hRow As HTMLTableRow
            Dim hCell As HTMLTableCell
            For Each hRow In RawData.Rows

                For Each hCell In hRow.Cells
                    Cells(RowNumber,ColumnNumber).Value = hCell.innerText
                    ColumnNumber = ColumnNumber + 1
                Next hCell
                ColumnNumber = 1
                RowNumber = RowNumber + 1
            Next hRow

            RowNumber = RowNumber + 3
        Next button
    End With

End Sub

它的作用是启动一个不可见的IE,读取数据,点击按钮,读取下一个等等……

对于调试我建议将.Visible设置为1,这样你就会发生什么.

编辑1:如果你得到一个debbuging错误,尝试Abort并再次运行它,它肯定需要一些错误处理,如果网站没有正确加载.

编辑2:使它更稳定,你应该真的付出注意,因为网页需要一些时间来加载,你必须在写入之前检查数据是否已经改变.如果它没有改变等待一秒左右然后再试一次.

这里我在Excel中获得了一些示例数据:

Sample Data

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是一门用来描述网页上样式的语言,通过编写CSS代码可以实现网页中各元素的大小、颜色、字体等各种样式的控制。那么如何在HTML代码中应用CSS样式来改变字体颜色呢?这里为大家介绍一下。 首先,在HTML代码...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及z-index属性。 img { position: relative; z-index: -1; } p { position: absolute; to...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的文字字体。常用的字体标签是font和style,下面我们来学习如何使用这些标签。 1. font标签 使用font标签可以改变文字的字体、颜色和大小。它有三个属性font-family、color和...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环节,因为它们直接关系到页面的可读性和视觉效果。 要指定文本的字体和字号,可以使用HTML中的样式属性。使用样式属性设置字体和字号,如下所示: <p style="font-family: Aria...
HTML(Hypertext Markup Language,超文本标记语言)是一种用于创建网页的标准语言。它由许多标签(一对尖括号包围的关键字)组成,这些标签告诉浏览器如何显示内容。使用HTML代码,我们可以轻松地创建各种类型的图像和图形,如太极图。 在HTM...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以通过这个链接直接跳转到其他网站。在HTML中,实现外链的方法很简单,只需要使用标签就可以了。 <a href="http://www.example.com">这是一个外链,点击跳转到www.ex...
HTML代码是实现网页界面的基础,而网页中的各种表单则是用户和网站进行交互的重要方式之一。下面我们来介绍如何使用HTML代码实现一个简单的报名表格。 <form action="submit.php" method="post"> &lt...
HTML是一种标记语言,用于开发网站和其他互联网内容。字体是网站设计中的关键元素之一,它可以决定网站的整体风格和呈现效果。HTML提供了字体编辑器,使网站设计变得更加容易。 <font face="Arial"> 这里是Arial字体 &...
HTML代码中,字体样式是开发者们必备的一部分。在HTML中,我们可以通过特定的标签和属性设置字体的样式、颜色和大小,以达到更好的排版效果。 <p style="font-size: 14px; color: #333; font-family:...
HTML中的字体可以设为粗体,以强调文本信息。我们可以通过使用一些标签来实现这一功能。其中,常用的标签包括: 1. 标签:该标签会把文本加粗显示,语法如下: 这是一段加粗的文本 2. 标签:与标签作用相同,但语义更强,表示该文本内容的重要性。语法如下:...
HTML代码可以实现文件的上传和下载,在网页开发中相当常见。通过使用<input>标签和<form>标签,我们可以轻松创建一个文件上传表单。 <form action="upload.php" method="post" enct...
HTML代码非常常见于网页设计中。在一些需要处理时间相关数据的场景下,可能需要将时间戳转换为实际时间,这时候就需要使用一些特定的HTML代码。 function timeStamp2Time(time){ var date = new Date(time...
HTML是一种用于创建网页的标记语言。在HTML中,我们可以使用超链接标签实现下载文件到本地的功能。 具体实现步骤如下: <a href="文件的URL" download="文件名">下载文件</a> 其中,href属性是文件...
在HTML代码中,对于字体靠左对齐有各种方法。其中最简单的方式之一是使用pre标签。 使用pre标签可以保留一段文本中的空格和换行符,从而使代码排版更加整齐。下面是一个例子: <p>这是一个段落。</p> &lt...
HTML代码字典是一本解释HTML标记和属性的参考文献。这本字典中包含了最常用的HTML代码以及它们的属性和值的详细描述。 例如,以下是HTML代码字典中的一部分内容: <a href="url">link text</a> 在...
在网页开发过程中,遇到一些需要用户复制的内容,我们通常都会提供复制按钮,让用户更方便地复制所需内容。下面我们来介绍如何使用html代码实现一键复制的功能。 var copyBtn = document.querySelector('#copy-bt...
用户登录 欢迎来到公司登录界面,请输入用户名和密码登录 用户名: 密码: 代码解释: 第1行:定义了一个 HTML 文档 第2行:开始了 HTML 头部 第3行:定义了...
HTML 代码是用来创建网页的语言,它包含了许多不同的元素和属性,让我们可以在网页中添加各种不同的元素和内容,如文字、图片、链接等等。在编写 HTML 代码时,我们可以使用各种不同的样式来美化我们的网页,例如更改字体、颜色、大小等等。 font-family:...
HTML代码中的字体转移 在编写HTML代码时,我们经常会使用各种字体来增强页面的可读性和视觉效果。但是,有些字符或特殊符号可能会在HTML中具有不同的含义,这就需要使用字体转义转换成HTML可以正常显示的字符。 在HTML中,使用"&"符号表示一个特殊字符将要被转...
HTML 编程语言中,你可以使用字体属性来更改文本的字体大小、颜色和样式。其中,字体颜色是最常用的样式更改。在 HTML 中,你可以使用 "color" 属性来更改文本的颜色。下面是一个使用 "pre" 标签的代码示例,演示如何使用 "color" 属性来更改字体颜色...