我正在尝试编写一些可抓取不同资产类别数据的代码。用户输入要获取其信息的股票名称,然后代码获取该特定股票的相关定量数据。
我当时在考虑使用VBA,因为将数据输出到excel电子表格很容易。但是如果容易的话,也可以使用其他语言(我知道一些Python)。
我遇到的问题是似乎没有要查看的唯一标签,然后才能访问我想要的数据表。
例如我可以GetElementsByClassName("clear")
,但其中许多存在。我以为也许我可以访问表类名称本身。我对此有两个问题:
1):我无法在VBA中使用它,因为它似乎不喜欢此类名称所具有的空格
2):即使我可以使用它,我也不知道超量库存的类名是否相同...
任何建议都非常感谢。这是我最复杂的VBA项目。
答案 0 :(得分: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 :(得分: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
之前:
之后: