【问题标题】:VBA Webscrape not picking up elmenents; pick up frames/tables?VBA Web Scrape 不拾取元素;拾取框架/桌子?
【发布时间】:2024-12-04 10:15:01
【问题描述】:

试过问这个问题。没有得到很多答案。无法将东西安装到我的工作计算机上。 https://*.com/questions/29805065/vba-webscrape-not-picking-up-elements

想要使用以下代码将晨星页面抓取到 Excel 中。问题是,它不会反馈任何真实的元素/数据。实际上,我只想从我放入 my_Page 的链接中获得股息和上限收益分布表。

这通常是最简单的方法,但是整个页面的抓取方式,并且 Excel-->数据-->来自 Web 不起作用。

我之前尝试过通过标签名称和类来获取元素,但在这种情况下我无法做到这一点。这可能是要走的路……再一次,只想要股息和上限增益分布表。通过 Debug.print 看不到任何结果

下面的工作代码,只需要解析成excel。以下更新尝试:

Sub Macro1()


    Dim IE As New InternetExplorer
    IE.Visible = True
    IE.navigate "http://quotes.morningstar.com/fund/fundquote/f?&t=ANNPX&culture=en_us&platform=RET&viewId1=2046632524&viewId2=3141452350&viewId3=3475652630"
    Do
    DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE
    Dim doc As HTMLDocument
    Set doc = IE.document



    'For Each Table In doc.getElementsByClassName("gr_table_b1")

    'For Each td In Table.getElementsByTagName("tr")
    On Error Resume Next
    For Each td In doc.getElementsByClassName("gr_table_row4")
    Debug.Print td.Cells(5).innerText
    'Debug.Print td.Cells(1).innerText
    Next td
    'Next Table


    'IE.Quit
         'Application.EnableEvents = True



  End Sub

【问题讨论】:

    标签: vba excel tags web-scraping


    【解决方案1】:

    相关内容包含在 iframe 中。您可以通过右键单击 sebsite 的该部分并选择 Inspect element 来查看此内容。查找树,您会看到一个 iframe 标记,其中包含数据的 url。您应该尝试找到该元素,并提取该 url(使用 生成),然后打开该页面。

    【讨论】:

    • 我当前的环境有一个旧版本的 IE,它不能正确呈现页面,所以我无法构建一些东西来真正做到这一点。
    • iframe 是这个quotes.morningstar.com/fund/fundquote/…。我的调试现在产生了一些东西(它只是说“YTD”)。我想如果我能把这些标签弄对,我现在就可以做生意了。
    • @pjhollow 让您知道。我最后得到了一个不同的 URL。由js 生成的viewIDs 接缝。我不确定如果你硬编码这些值会发生什么。
    • 感谢您抽出宝贵时间调查此事。介意粘贴您看到的网址吗?
    【解决方案2】:

    无需担心框架。您只需要表 id。


    网页浏览量:


    从代码中打印出来:


    VBA:

    Option Explicit
    Public Sub GetDivAndCapTable()
        Dim ie As New InternetExplorer, hTable As HTMLTable
        Const URL = "http://quotes.morningstar.com/fund/fundquote/f?&t=ANNPX&culture=en_us&platform=RET&viewId1=2046632524&viewId2=3141452350&viewId3=3475652630"
        Application.ScreenUpdating = False
        With ie
            .Visible = True
    
            .navigate URL
    
            While .Busy Or .READYSTATE < 4: DoEvents: Wend
    
            Set hTable = .document.getElementById("DividendAndCaptical")
            WriteTable hTable, 1
            Application.ScreenUpdating = True
            .Quit
        End With
    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
                    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
                    R = R + 1
                Next tr
            Next tSection
        End With
    End Sub
    

    【讨论】: