【问题标题】:Extract specific table part of the webpage in excel?在excel中提取网页的特定表格部分?
【发布时间】:2016-10-27 17:38:58
【问题描述】:

我是 Excel VBA/宏的新手

我需要抓取页面的特定部分,而不是整页。 下面的代码在完整的页面中工作,但不需要页面的所有部分。

Sub GrabOutStandingTable()

With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://dsebd.org/displayCompany.php?name=ABBANK", Destination:=Range( _
    "$A$1"))
    .CommandType = 0
    .Name = "displayCompany.php?name=ABBANK"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingNone
    .WebTables = """company"""
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .WebDisableRedirections = False
    .Refresh BackgroundQuery:=False
End With
Sheets.Add After:=ActiveSheet
End Sub

标题为“公司其他信息”的表格部分在页面下方,这就是我所说的。宏应该提取这部分。

【问题讨论】:

    标签: vba excel excel-web-query


    【解决方案1】:

    XHR 请求:

    如果您按元素的(非唯一)company id 收集元素,则可以执行更快的无浏览器 XHR 请求并简单地定位感兴趣的表,该表位于位置 23。

    我使用querySelectorAll方法抓取匹配的节点,然后提取索引23处的表。

    注意代码输出中显示的其他赞助商信息。


    网页浏览量:


    示例代码输出:


    代码:

    Option Explicit
    Public Sub GetTable()
        Dim sResponse As String, hTable As Object, HTML As New HTMLDocument
        Application.ScreenUpdating = False
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "https://dsebd.org/displayCompany.php?name=ABBANK", False
            .send
            sResponse = StrConv(.responseBody, vbUnicode)
        End With
    
        sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
            With HTML
                .body.innerHTML = sResponse
                Set hTable = .querySelectorAll("#company")(23)
            End With
           WriteTable hTable
           Application.ScreenUpdating = True
    End Sub
    
    Public Sub WriteTable(ByVal hTable As HTMLTable, Optional ByVal startRow As Long = 1, Optional ByVal ws As Worksheet)
    
        If ws Is Nothing Then Set ws = ActiveSheet
    
        Dim tSection As Object, tRow As Object, tCell As Object, tr As Object, td As Object, R As Long, C As Long, tBody As Object
        R = startRow
        With ws
            Dim headers As Object, header As Object, columnCounter As Long
            Set headers = hTable.getElementsByTagName("th")
            For Each header In headers
                columnCounter = columnCounter + 1
                .Cells(startRow, columnCounter) = header.innerText
            Next header
            startRow = startRow + 1
            Set tBody = hTable.getElementsByTagName("tbody")
            For Each tSection In tBody               'HTMLTableSection
                Set tRow = tSection.getElementsByTagName("tr") 'HTMLTableRow
                For Each tr In tRow
                    R = R + 1
                    Set tCell = tr.getElementsByTagName("td")
                    C = 1
                    For Each td In tCell             'DispHTMLElementCollection
                        .Cells(R, C).Value = td.innerText 'HTMLTableCell
                        C = C + 1
                    Next td
                Next tr
            Next tSection
        End With
    End Sub
    

    参考资料:

    VBE > 工具 > 参考 > HTML 对象库

    【讨论】:

      【解决方案2】:

      由于网站的结构方式,旧数据 > From Web 无法处理此问题。您需要的数据深深嵌套在其他表中,由多个表组成。

      建议改用 Power Query(不需要 VBA)。这是如何在 XL2013 中使用 Power Query 的方法。使用 Excel 的功能区并找到选项卡 POWER QUERY。

      1. 使用菜单选项:POWER QUERY > From Web
      2. 显示来自 Web 对话框。输入您的网址。
      3. 点击确定
      4. 您需要的数据在表 30 中。找到并单击它,然后单击加载。

      如果我们有 XL2016 (office 365),我们已经有 Power Query。如果我们有 XL2010 或 XL2013,我们可以从以下地址下载:https://www.microsoft.com/en-us/download/details.aspx?id=39379&CorrelationId=1441491e-917e-43de-8d6a-21f98287c3c2

      【讨论】:

      • 请以任何其他方式......因为如果我手动执行此操作,我必须浏览 300 多个页面才能为 300 多个公司简介收集相同的结构化数据(表格)。所以也需要自动化该过程....在 url "name=ABBANK" 中,这是链接的唯一变量,如果我只是将字符串 "ABBANK" 更改为另一个特定的。它应该加载另一个公司简介换句话说,实际上我需要从 300 多家公司简介中收集相同的结构化数据。那么,我该怎么做呢??
      • 另一件事是,我到现在都无法安装 PowerQuery 工具。它需要 InternetExplorer 9 或更高版本,我的 win7 系统不支持 "EIE11_EN-US_WOL_WIN7.EXE" :(
      • 是的,我有你需要的东西。下面是一个解释它的链接。我会为你制作一个原型并稍后发布到这里。
      • 这是我认为您需要的原型的链接。在第一列中输入库名称,然后使用工具栏的加载/刷新表加载所有库。使用工具栏的加载/刷新行只加载一个。
      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2022-01-11
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多