网页到excel:从多个页面的排名中提取数据

网页到excel:从多个页面的排名中提取数据,excel,http,text,Excel,Http,Text,这是我的第一篇博文,我很不爽! 请原谅我的问题令人不快 我想做的是从中提取排名 下面是html的摘录 <tr> <td style="width:10px;" valign="top">3.</td> <td class="name" style="width:360px;" align="left"> <img alt="The Official Maste

这是我的第一篇博文,我很不爽! 请原谅我的问题令人不快

我想做的是从中提取排名

下面是html的摘录

   <tr>
          <td style="width:10px;" valign="top">3.</td>
          <td class="name" style="width:360px;" align="left">





              <img alt="The Official Masters Tournament" height="16" src="http://a5.mzstatic.com/us/r1000/082/Purple/v4/7b/db/9e/7bdb9e4a-7dea-6cb9-e46f-eba29f1d68a3/yzdmBWtm3FestDVRYi9gYg-temp-upload.mislucox.175x175-75.jpg" width="16" />
              &nbsp;
              <a href="/ios_apps/apps/4435931-the-official-masters-tournament">The Official Masters Tournament</a>                

          </td>

          <td align="right" style="padding-right:10px">

            3

          </td>







            <td align="right" style="color:black;; padding-right:10px">=</td>


      </tr>

      <tr>
          <td style="width:10px;" valign="top">4.</td>
          <td class="name" style="width:360px;" align="left">
              <img alt="LEGO® Ninjago: Rise of the Snakes" height="16" src="http://a1.mzstatic.com/us/r1000/063/Purple/v4/d8/3d/e0/d83de000-7ba6-1b0c-837a-7a7f6ca9dccf/mzl.ttwivuek.175x175-75.jpg" width="16" />
              &nbsp;
              <a href="/ios_apps/apps/4397421-lego-ninjago-rise-of-the-snakes">LEGO® Ninjago: Rise of the Snakes</a>

          </td>

          <td align="right" style="padding-right:10px">

            4

          </td>

            <td align="right" style="color:black;; padding-right:10px">=</td>

      </tr>

3.
3.
=
4.
4.
=
并将其导出到excel

我可以复制粘贴(到excel),但排名有很多页长。 我需要复制,粘贴,点击下一页,复制,粘贴

你能想出一个解决办法吗?
非常感谢

这里有一些你可以做的事情,尽管这不是你想要的

在Excel 2007/2010中,转到数据选项卡,在“获取外部数据”组中,单击“来自Web”。将在url中输入一个位置,在其中输入此位置:

它与您显示的相同,但在url中将页面设置为1。将有一个带有黑色箭头的黄色框,指向您要查看的桌子。点击那个箭头

然后它会要求您将其放入工作簿中。我将其放在Sheet2中(如果您选择不同的工作表,则必须通过将Sheet2替换为工作表名称来调整代码)。这添加了一个查询表,它将显示您想要输入Excel单元格的数据

然后,可以添加VBA代码以循环浏览页面。按Alt+F11转到Visual Basic编辑器。创建新模块并将此代码粘贴到其中:

Sub previousPage()
    Call switchPage(-1)
End Sub


Sub nextPage()
    Call switchPage(1)
End Sub

Sub switchPage(num As Integer)
    Dim q As QueryTable
    Set q = Sheet2.QueryTables(1)
    Dim currentPage As String
    Dim nextPage As String
    currentPage = Mid(q.Connection, InStr(1, q.Connection, "page=", vbTextCompare) + Len("page="), 2)
    If (IsNumeric(currentPage)) Then
        nextPage = CInt(currentPage) + num
    End If
    q.Connection = "URL;http://www.appdata.com/leaderboard/app_store_apps?fanbase=0&id=3781-top-free-apps&metric_select=mau&page=" & nextPage
    q.Refresh BackgroundQuery:=False
End Sub
这段代码所做的是循环浏览页面。当运行
nextPage()
时,它将更改URL以转到第2页。你明白了


从这里,您可以在Sheet2的表格上方添加按钮,并将它们连接到
previousPage()
nextPage()

作为对您的评论的响应,这里有一种方法可以在一张表格中显示所有页面,而无需按钮。不过,我想指出的是,在我尝试的过程中,我似乎无法删除返回的后续页面的表头。这段代码将把网站的每一页添加到上一页的下方,这样你就可以一直向下滚动。运行一次之后,我建议使用“刷新所有”按钮,而不是再次运行代码

编辑:我修改了代码,将“仅复制值”包含到另一个工作表中,以便静态保存数据

代码如下:

Sub createQueryTable()
    Dim wsQuery As Excel.Worksheet
    Dim wsValues As Excel.Worksheet
    Dim q As Excel.QueryTable
    Dim destination As Excel.Range
    Dim connection As String
    Dim lastRow As Long, currentRow As Long
    Dim i As Long

    Set wsValues = ThisWorkbook.Worksheets.Add
    Set wsQuery = ThisWorkbook.Worksheets.Add

    Set destination = ActiveSheet.Range("A1")
    connection = "URL;http://www.appdata.com/leaderboard/app_store_apps?fanbase=0&id=3781-top-free-apps&metric_select=mau&page="
    lastRow = 1

    For i = 1 To 100
        If (lastRow <> currentRow) Then
            currentRow = lastRow
        Else
            Exit For
        End If
        Set q = wsQuery.QueryTables.Add(connection:=connection & i _
                                        , destination:=wsQuery.Cells(currentRow, "A") _
                                        )
        q.Name = "app_store_apps?fanbase=0&id=3781-top-free-apps&metric_select=mau&page=" & i
        q.WebTables = "8"
        q.RowNumbers = False
        q.BackgroundQuery = True

        If (currentRow = 1) Then
            q.FieldNames = True
        Else
            q.FieldNames = False
        End If

        q.Refresh BackgroundQuery:=False

        lastRow = getNextAvailableRow(wsQuery, "A")
    Next

    wsQuery.Range("A1", wsQuery.Cells.SpecialCells(xlCellTypeLastCell)).Copy
    wsValues.Range("A1").PasteSpecial Paste:=xlPasteValues
    wsValues.Activate
    Application.CutCopyMode = False
End Sub

Function getNextAvailableRow(ByRef ws As Excel.Worksheet, ByRef columnLetter As String) As Long
    Dim r As Long
    r = ws.Cells(ws.Rows.Count, columnLetter).End(xlUp).Row
    getNextAvailableRow = r + 1
End Function
Sub-createQueryTable()
将wsQuery设置为Excel.Worksheet
将值设置为Excel.Worksheet
将q设置为Excel.QueryTable
将目标设置为Excel.Range
将连接设置为字符串
将最后一行变长,当前行变长
我想我会坚持多久
设置wsValues=thiswoolk.Worksheets.Add
设置wsQuery=thiswoolk.Worksheets.Add
设置目的地=ActiveSheet.Range(“A1”)
连接=“URL;http://www.appdata.com/leaderboard/app_store_apps?fanbase=0&id=3781-顶级免费应用程序和指标选择=mau和页面=”
lastRow=1
对于i=1到100
如果(lastRow currentRow),则
currentRow=lastRow
其他的
退出
如果结束
设置q=wsQuery.QueryTables.Add(连接:=connection&i_
,destination:=wsQuery.Cells(当前行,“A”)_
)
q、 Name=“app\u store\u apps?fanbase=0&id=3781顶级免费apps&metric\u select=mau&page=”&i
q、 WebTables=“8”
q、 行数=False
q、 BackgroundQuery=True
如果(currentRow=1),则
q、 FieldNames=True
其他的
q、 FieldNames=False
如果结束
q、 刷新背景查询:=False
lastRow=getNextAvailableRow(wsQuery,“A”)
下一个
wsQuery.Range(“A1”,wsQuery.Cells.SpecialCells(xlCellTypeLastCell)).Copy
wsValues.Range(“A1”).Paste特殊粘贴:=xlPasteValues
wsValues.Activate
Application.CutCopyMode=False
端接头
函数getNextAvailableRow(ByRef ws作为Excel.worket,ByRef columnLetter作为字符串)的长度为
变暗,变长
r=ws.Cells(ws.Rows.Count,columnLetter).End(xlUp).Row
getNextAvailableRow=r+1
端函数

非常感谢,这太棒了!!!你能帮我把400个结果(10页*40个结果/页)放在一张纸上,没有按钮吗?非常感谢joseph4tw,这真是太棒了。它非常有效,非常有用。为了追踪这个排名的历史,你建议我做点什么吗?也许我应该在一台一年中每天都不睡觉的电脑上运行一个脚本?你推荐一种语言吗?我试着在同一个网站上使用相同的公式,但属于不同的类别(健康和健身)。网页变成:所以我把你的脚本,并试图适应新的地址。因为页码现在在URL中,所以我尝试进行正确的更改。但它不起作用。你知道要修改什么吗?这是我尝试过的编辑代码:嗨,恩佐利托,我很高兴你喜欢这个解决方案!至于历史记录,我想说您可以在URL中包含日期过滤器,并根据需要对其进行操作。但是,如果您需要它们是静态的,那么您可以简单地将它们作为值复制/粘贴到另一个工作表中,并将工作表命名为April-2012或其他。另外,我相信你修改的健身代码不起作用,因为你必须是“专业”的成员才能看到这些结果。如果您是,也许您可以先登录,然后运行查询,但我不确定它是否有效,因为Excel可能不会使用您的cookies。非常感谢您的帮助,非常感谢!说到历史,我只是想每天运行这个脚本,并存储结果。这样我就可以把结果用图表表示出来。我写的代码不是关于历史数据(我一天前发布了它,所以它看起来像这样),而是关于在一个精确的类别中获得完全相同的排名。