【问题标题】:Data scraping different asset class data数据抓取不同的资产类别数据
【发布时间】:2023-03-06 10:27:01
【问题描述】:

我正在尝试编写一些代码来抓取不同的资产类别数据。用户输入他们想要获取信息的股票名称,然后代码获取该特定股票的相关定量数据。

我在考虑 VBA,因为它可以很容易地将数据输出到 Excel 电子表格中。但是如果更容易的话,我对其他语言持开放态度(我知道一点 Python)。

我遇到的问题是似乎没有任何独特的标签可供查看,以便能够访问我想要的数据表。

例如我可以GetElementsByClassName("clear"),但其中很多都存在。我想也许我可以访问表类名本身。我有两个问题:

1):我无法让它在 VBA 中工作,因为它似乎不喜欢这个类名的空格

2):即使我让它工作,我不知道类名是否会与 overstocks 相同......

任何建议都非常感谢。这是我最复杂的 VBA 项目。

【问题讨论】:

  • 你不能获取表的<tbody>,然后迭代它的<td> 孩子吗?
  • 顺便说一句,您可以获得带有 companyFinancialSummaryTbl 类的表(class="..." 属性是一个以空格分隔的 CSS 类列表;您的选择器可以使用任何 其中一个

标签: excel vba web-scraping


【解决方案1】:

我无法让它在 VBA 中工作,因为它似乎不喜欢这个类名的空格

元素有3个类; CSS 类中没有空格。

您可以GetElementsByClassName("companyFinancialSumaryTbl"),这将为您提供包含<table> 元素的节点集合,大概是第一个也是唯一的项目。

从那里你可以得到<tbody>子元素,然后你可以迭代它的<tr>子元素,并且在每一行你可以迭代<td>子节点;当 <td> 具有 bold 类时,您知道您正在查看行标题。

即使我让它工作,我不知道类名是否会与 overstocks 相同......

我们也不知道!如果有另一个表要从中读取数据,它可能没有companyFinancialSummaryTbl 类,可能有一些overstocksTbl 类;无论哪种方式,它将是一个带有子节点的 <table> 元素,您可以导航和迭代。

我对网络抓取不是很熟悉,但是假设您在对象e 中有<table> 元素,那么您可以想象得到像这样的<tbody> 元素:

Dim thead As Object
Set thead = e(0)

Dim tbody As Object
Set tbody = e(1)

如果可行,那么这也应该:

Dim tr As Object
For Each tr In tbody
    Dim td As Object
    For Each td In tr
        Debug.Print td,; ' comma prints a tab, semicolon skips printing the line break
    Next
    Debug.Print 'print the line break
Next

【讨论】:

    【解决方案2】:

    嗯,你没有分享一个 URL,但我会告诉你我会如何做到这一点,一般来说。您可以将想法抽象到您的特定用例中。

    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
        Dim c As Range
        Dim sht As Worksheet
        Dim LastRow As Long
        Dim wb As Workbook: Set wb = ThisWorkbook
    
        Set sht = wb.Sheets("Stocks")
    
        'find last used row in ColumnA
        LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
    
        For Each c In Range("A2:A" & LastRow)
    
        mystock = c.Value
    
            objIE.Navigate "https://www.asx.com.au/asx/share-price-research/company/" & mystock & "/details"
    
            Do Until objIE.ReadyState = 4 And Not objIE.Busy
                DoEvents
            Loop
    
            Sheets.Add After:=ActiveSheet
            ActiveSheet.Name = mystock
    
            ActRw = 1
            Application.Wait (Now + TimeValue("0:00:01")) '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.ActiveSheet.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
    
        Next c
    
        objIE.Quit
    
    End Sub
    

    之前:

    之后:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2014-07-21
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多