数据搜刮不同资产类别数据

问题描述 投票:0回答:1

我正试图写一些代码,以刮取不同的资产类别数据。用户输入他们想要获得信息的股票名称,然后代码就会获取该特定股票的相关量化数据。

我想使用VBA,因为它很容易将数据输出到excel电子表格中。但是,如果其他语言更容易的话,我也愿意接受(我懂一点Python)。

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

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

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

2): 即使我把它弄好了,我也不知道班级名称是否会和超额存货一样... ...

任何建议真的很感激。这是我最复杂的VBA项目。

Tag example

excel vba web-scraping
1个回答
2
投票

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

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

你可以 GetElementsByClassName("companyFinancialSumaryTbl"),这将得到一个节点的集合,其中包括了 <table> 元素,可能是第一个也是唯一的一个项目。

从那里你可以得到 <tbody> 子元素,然后你可以迭代它的 <tr> 子女,在每一行中,你都可以迭代出 <td> 子节点;当一个 <td> 拥有 bold 类,你就知道你要看的是一个行标题。

就算我弄好了,我也不知道班级名称会不会和多出来的股票一样... ...

我们也不知道! 如果有另一个表来读取数据,它可能没有这个 companyFinancialSummaryTbl 类,很可能有一些 overstocksTbl 类代替;无论哪种方式,它都将是一个 <table> 元素与子节点,你可以导航和迭代。

我对网络搜刮不是很熟悉,但如果说你有这个 <table> 元素 e,那么你就可以想象得到的。<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

1
投票

好吧,你没有分享一个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

之前:"之前"。

enter image description here

After:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.