【问题标题】:Scraping tr class information using Excel VBA使用 Excel VBA 抓取 tr 类信息
【发布时间】:2020-04-25 22:26:56
【问题描述】:

我在 Excel VBA 中创建了一个简单的程序,用于从https://www.nasdaq.com/market-activity/stocks/aapl/financials 中抓取表格中的所有信息。我在其他网站上使用过类似的代码,但由于某种原因,我无法让这个代码正常工作。谁能指出我所缺少的?任何帮助将不胜感激。

“编辑代码”

Public Sub GetCompanyFinancials()

Dim XMLPage As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim HTMLTables As MSHTML.IHTMLElementCollection
Dim HTMLTable, HTMLRow, HTMLCell As MSHTML.IHTMLElement

XMLPage.Open "GET", "https://www.nasdaq.com/market-activity/stocks/aapl/financials", False
XMLPage.send

HTMLDoc.body.innerHTML = XMLPage.responseText

Set HTMLTables = HTMLDoc.getElementsByTagName("table")

For Each HTMLTable In HTMLTables
    For Each HTMLRow In HTMLTable.getElementsByTagName("tr")
        For Each HTMLCell In HTMLRow.Children
            Debug.Print HTMLCell.innerText
        Next HTMLCell
    Next HTMLRow
Next HTMLTable

End Sub

【问题讨论】:

  • 该网站的内容是动态的。使用这个link
  • @SIM 提到的链接加上这个json parser
  • 感谢您的链接!

标签: html excel vba web-scraping finance


【解决方案1】:

我确信有很多方法可以做这种事情。这是一个。

Sub Web_Table_Option_Two()
    Dim HTMLDoc As New HTMLDocument
    Dim objTable As Object
    Dim lRow As Long
    Dim lngTable As Long
    Dim lngRow As Long
    Dim lngCol As Long
    Dim ActRw As Long
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    objIE.Navigate "https://www.nasdaq.com/market-activity/stocks/aapl/financials"

    Do Until objIE.ReadyState = 4 And Not objIE.Busy
        DoEvents
    Loop
    Application.Wait (Now + TimeValue("0:00:03")) 'wait for java script to load
    HTMLDoc.body.innerHTML = objIE.Document.body.innerHTML
    With HTMLDoc.body
        Set objTable = .getElementsByTagName("table")
        For lngTable = 0 To objTable.Length - 1
            For lngRow = 0 To objTable(lngTable).Rows.Length - 1
                For lngCol = 0 To objTable(lngTable).Rows(lngRow).Cells.Length - 1
                    ThisWorkbook.Sheets("Sheet1").Cells(ActRw + lngRow + 1, lngCol + 1) = objTable(lngTable).Rows(lngRow).Cells(lngCol).innerText
                Next lngCol
            Next lngRow
            ActRw = ActRw + objTable(lngTable).Rows.Length + 1
        Next lngTable
    End With
    objIE.Quit
End Sub

结果:

【讨论】:

  • 感谢您的代码,它运行良好。你知道为什么我上面贴的代码只返回空白吗?我以前在动态网站上使用过类似的东西,没有问题。另外,您对我可以去哪里了解有关 VBA 网络抓取的更多信息有什么建议吗?我看过一些 YouTube 教程并阅读了一些其他网站,但我显然仍然缺乏这种“专业知识”。任何建议将不胜感激!
  • 练习,练习,练习。就像生活中的所有事物一样,您可以从中摆脱,投入什么。
  • 我很久以前就收藏了这个链接:tushar-mehta.com/publish_train/xl_vba_cases/… 这是一个好的开始;和任何一样好。当然它不会回答你所有的问题,而且我当然不知道有任何权威的来源可以回答所有 Excel/VBA/Web 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2018-10-27
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多