我正试图写一些代码,以刮取不同的资产类别数据。用户输入他们想要获得信息的股票名称,然后代码就会获取该特定股票的相关量化数据。
我想使用VBA,因为它很容易将数据输出到excel电子表格中。但是,如果其他语言更容易的话,我也愿意接受(我懂一点Python)。
我遇到的问题是,似乎没有任何独特的标签,以便能够访问我想要的数据表格。
例如,我可以 GetElementsByClassName("clear")
但其中有很多是存在的。我想也许我可以访问表类名本身。我有两个问题。
1): 我不能让它在VBA中工作,因为它似乎不喜欢这个类名中的空格。
2): 即使我把它弄好了,我也不知道班级名称是否会和超额存货一样... ...
任何建议真的很感激。这是我最复杂的VBA项目。
我不能让它在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
好吧,你没有分享一个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
之前:"之前"。
After: