【问题标题】:How to read the nested table <td> values using VBA?如何使用 VBA 读取嵌套表 <td> 值?
【发布时间】:2012-10-21 00:18:30
【问题描述】:

任何人在这里帮助我说如何使用 Excel VBA 从第三方应用程序读取嵌套的 html 表值?作为下面的示例,我粘贴了 HTML 源代码的一部分,我想在其中读取所有值并将其存储到 excel 中。但是在这里,所有这些都是他们使用的嵌套表,并且这些表也没有任何名称在我见过的html源代码中。

<td>
<table cellspacing="1" cellpadding="0" class="data">
<tr class="colhead">
<th colspan="3">Expression</th>
 </tr>
<tr class="colhead">
<th>Field</th>
<th>Operator</th>
<th>Answer</th>
</tr>
<tr class="rowLight">
<td width="40%">        
Location Attributes:  LOC - Sub Commodity
</td>
<td width="20%">
= 
</td>
<td width="40%">
Abrasives
</td>
</tr>
<tr class="rowDark">
<td width="40%">
Location Attributes:  LOC - Commodity Tier1
</td>
<td width="20%">
= 
</td>
<td width="40%">
Advertising, Sales &amp; Promotion
</td>
</tr>

谢谢, 奥雅纳

【问题讨论】:

  • 这是一个嵌套表吗?甚至没有表声明。
  • 我参与了源 html 的部分。你要我在这里粘贴完整的源代码吗?告诉我然后我会这样做..
  • 我已经更新了源 html。这是我从网页源获得的 HTMl 源

标签: excel web-scraping vba


【解决方案1】:

请在下面找到代码:

Option Explicit 

Sub TableExample() 
    Dim IE As Object 
    Dim doc As Object 
    Dim strURL As String 

    strURL = "[URL="http://example.comwww.dectech.org/football/index.php"]http://example.com[/URL]" ' replace with URL of your choice

    Set IE = CreateObject("InternetExplorer.Application") 
    With IE 
         '.Visible = True

        .navigate strURL 
        Do Until .ReadyState = 4: DoEvents: Loop 
            Do While .Busy: DoEvents: Loop 
                Set doc = IE.Document 
                GetAllTables doc 

                .Quit 
            End With 
        End Sub 

        Sub GetAllTables(doc As Object) 

             ' get all the tables from a webpage document, doc, and put them in a new worksheet

            Dim ws As Worksheet 
            Dim rng As Range 
            Dim tbl As Object 
            Dim rw As Object 
            Dim cl As Object 
            Dim tabno As Long 
            Dim nextrow As Long 
            Dim I As Long 

            Set ws = Worksheets.Add 

            For Each tbl In doc.getElementsByTagName("TABLE") 
                tabno = tabno + 1 
                nextrow = nextrow + 1 
                Set rng = ws.Range("B" & nextrow) 
                rng.Offset(, -1) = "Table " & tabno 
                For Each rw In tbl.Rows 
                    For Each cl In rw.Cells 
                        rng.Value = cl.outerText 
                        Set rng = rng.Offset(, 1) 
                        I = I + 1 
                    Next cl 
                    nextrow = nextrow + 1 
                    Set rng = rng.Offset(1, -I) 
                    I = 0 
                Next rw 
            Next tbl 

            ws.Cells.ClearFormats 

        End Sub 

【讨论】:

    【解决方案2】:

    这就是我阅读 HTML 表格的方式:

    Sub ReadHTMLtable()
    Dim htmldb As New ADODB.Connection
    Dim htmlcmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
    
    With htmldb
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=Z:\filename.html;Extended Properties=""HTML Import;HDR=YES;IMEX=1"""
        .Open
    End With
    
    Set htmlcmd.ActiveConnection = htmldb
    htmlcmd.CommandType = adCmdText
    htmlcmd.CommandText = "Select * from [table]"
    rs.CursorLocation = adUseClient
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open htmlcmd
    
    'process rs here
    
    End Sub
    

    这使用了 ADO,但是对于 DAO 应该是一样的

    【讨论】:

    • 但是为此我需要在本地机器中将网页另存为.html,但是在运行时如何做到这一点?
    • 我需要在 MS Excel 中包含哪些参考资料?
    • 微软 HTML 对象库
    • 我只希望将值与列名字段名称、运算符和值一起保存在单独的 excel 中。例如。此处字段名称-> 位置属性:LOC - 子商品、操作员->=、answer-> 磨料和字段名称-> 位置属性:LOC - 商品 Tier1、操作员->=、answer-> 广告、销售 &晋升。那么如何做到这一点。我只对这些类型的值感兴趣,以便从网页中获取 excel 作为转储。
    • 您能帮我提出一些实现相同目标的好方法吗?
    【解决方案3】:

    这需要将引用设置为Microsoft HTML Object LibraryMicrosoft Internet Controls

    Sub Extract_TD_text()
    
        Dim URL As String
        Dim IE As InternetExplorer
        Dim HTMLdoc As HTMLDocument
        Dim TDelements As IHTMLElementCollection
        Dim TDelement As HTMLTableCell
        Dim r As Long
    
        'Saved from www vbaexpress com/forum/forumdisplay.php?f=17
        URL = "your file pathe/URL"
    
        Set IE = New InternetExplorer
    
        With IE
            .navigate URL
            .Visible = True
    
            'Wait for page to load
            While .Busy Or .readyState <> READYSTATE_COMPLETE: DoEvents: Wend
    
            Set HTMLdoc = .document
        End With
    
        Set TDelements = HTMLdoc.getElementsByTagName("TD")
    
        Sheet1.Cells.ClearContents
    
        r = 1
        For Each TDelement In TDelements
            'Look for required TD elements - this check is specific to VBA Express forum - modify as required
                If TDelement.ParentNode.ParentNode.ParentNode.Title = "table you want's title" Then
                    Sheet1.Range("A1").Offset(r, 0).Formula = "=" & Chr(34) & TDelement.innerText & Chr(34)
                    r = r + 1
                End If
        Next
    
        IE.Quit
        Set IE = Nothing  
    End Sub
    

    我基于this page

    【讨论】:

    • 但是它会给我整个源页面的所有 值对吗?
    • 是的。您打算如何确定要提取的部分?它有什么独特之处?
    • 看起来如果您的表被定义为您正在寻找title 属性。您需要在打印时将ParentNotesTDelement 提升3 个级别,并检查它是title。查看修改。
    • okie.. 我将有一个 vbs 代码,它可以帮助我在网络上导航或循环 url,一旦我到达那个特定的网页,我希望我的 vba 代码得到 读取值并将其插入另一个 excel.means 使用 VBS 一旦 VBA 完成数据提取并将其保存到 excel.for ex,我将跳转到下一个网页。我给出了下面的源代码,我想在其中读取字段名称、运算符和值——它们是我的最终 excel 中的三个目标列,vba 实际存储其读取数据:
    • 您在 VB 脚本和 VBA 中执行了其中的一部分?此外,我不确定这是否有助于我了解您如何确定所需的表格数据。
    【解决方案4】:

    我到处寻找这个问题的答案。我终于找到了实际上是通过录制宏的解决方案。我知道,你们都认为你在这之上,但它实际上是最好的方法。在此处查看完整帖子:http://automatic-office.com/?p=344 简而言之,您想要记录宏并从网络转到数据 --> 并导航到您的网站并选择所需的表格。
    我过去使用过上述解决方案“通过 id 获取元素”类型的东西,它对于一些元素非常有用,但是如果你想要一个完整的表格,并且你不是超级经验,只需记录一个宏。 不要告诉你的朋友,然后重新格式化它,让它看起来像你自己的作品,这样没人知道你使用了宏工具;)

    代码看起来像这样(包括所有多余的默认属性设置到它们的默认值,记录一个宏会为你做......找出哪些是多余的并删除它们

    Sub Macro1()
     With ActiveSheet.QueryTables.Add(Connection:= _
     “URL;http://w1.weather.gov/obhistory/KFRI.html”, Destination:=Range(“$D$4″))
     .Name = “KFRI”
     .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 = “4″
     .WebPreFormattedTextToColumns = True
     .WebConsecutiveDelimitersAsOne = True
     .WebSingleBlockTextImport = False
     .WebDisableDateRecognition = False
     .WebDisableRedirections = False
     .Refresh BackgroundQuery:=False
     End With
     End Sub
    

    享受

    【讨论】:

      【解决方案5】:

      这是另一种方式。棘手的是,如果你有一个嵌套表,你必须 获取父容器是否为div、table。在 IE 或 Chrome 中使用 F12 开发人员工具,然后按照自己的方式工作。在下面的示例中,有一个包含表格的 div。在问题中给出的示例中,有一个表包含一个表,因此您必须找到该父表并使用与此类似的代码来获取子表。希望对您有所帮助。

           stabledata = ""
           Set oTbl = odiv.getElementsByTagName("TABLE").Item(0)
           Set oThead = odiv.getElementsByTagName("THEAD").Item(0)
           Set oTRows = oThead.getElementsByTagName("TR").Item(0)
           Set oTds = oTRows.getElementsByTagName("TH")
      
           For Each oTd In oTds
              DoEvents
      
              stabledata = stabledata & oTd.innertext & Chr(9)
      
           Next oTd
           stabledata = stabledata & vbCrLf
           Set oTBody = odiv.getElementsByTagName("TBODY").Item(0)
           Set oTRows = oTBody.getElementsByTagName("TR")
           For Each oTRow In oTRows
              DoEvents
              Set oTds = oTRow.getElementsByTagName("TD")
              For Each oTd In oTds
                  DoEvents
      
                  stabledata = stabledata & oTd.innertext & Chr(9)
      
              Next oTd
      
              stabledata = stabledata & vbCrLf
      
           Next oTRow
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签