Нужна помощь в получении таблицы из HTML - PullRequest
0 голосов
/ 15 ноября 2018

Я успешно получал данные об эффективности взаимных фондов с Marketwatch.com, используя следующий код:

Dim A As Long
Dim B As Long
Dim C As Long
Dim Z As Long


For Z = 1 To 35

    Range("A1").Select
    ActiveCell.Offset((37 + (Z * 10)), 0).Select
    If ActiveCell.Value = "" Then
    Exit For
    Else
    End If
Dim oHTML       As Object
Dim oTable      As Object
Dim x           As Long
Dim Y           As Long
Dim vData       As Variant

Set oHTML = CreateObject("HTMLFile")

With CreateObject("WinHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.marketwatch.com/investing/fund/vfinx", False
.send
oHTML.body.innerhtml = .responsetext
End With

For Each oTable In oHTML.Getelementsbytagname("table")
If oTable.classname = "fundstable" Then
    ReDim vData(1 To oTable.Rows.Length, 1 To oTable.Rows(1).Cells.Length)

        For x = 1 To UBound(vData)
        For Y = 1 To UBound(vData, 2)
            vData(x, Y) = oTable.Rows(x - 1).Cells(Y - 1).innertext
        Next Y
        Next x

    With ActiveCell.Offset(1, 0)
    .Resize(UBound(vData), UBound(vData, 2)).Value = vData
    End With
Exit For
End If
Next oTable

Next Z

К сожалению, Marketwatch добавил капчу, чтобы боты (то есть я) не собирали свои данные. Я ничего не знаю об этом, поэтому я решил попробовать другой сайт.

Я посмотрел на Morningstar: http://performance.morningstar.com/fund/performance-return.action?t=VFINX&region=usa&culture=en_US

Похоже, что таблица, которую я хочу на этой странице, была бы: "table.r_table3 width955px print97" или просто "r_table3 width955px print97", но ни одна из них, похоже, не работает для меня.

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Данные загружаются с помощью javascript и не будут доступны через запрос XMLHTTP, поскольку сценарии не будут запускаться для загрузки содержимого.

Вы можете использовать эту вторую ссылку, например, в IE, и ввестиПодождите, чтобы убедиться, что информация загружена.Я показываю получение таблицы с этим именем класса по индексу 1. Вы можете изменить индекс здесь:

ele.item(1).outerHTML

Итак, для следующей таблицы используйте clipboard.SetText ele.item(2).outerHTML.

Вы также можете выполнить цикл.Length из ele для получения каждой таблицы, но при вставке убедитесь, что вы записываете в другую ячейку:

Dim i As Long
For i = 0 To ele.Length-1
    clipboard.SetText  ele.item(i).outerHTML
   'Etc   
Next

VBA:

Option Explicit

Public Sub GetInfo()
    Dim IE As New InternetExplorer, clipboard As Object
    Dim ele As Object, ws As Worksheet, t As Date, tableCount As Long
    Const MAX_WAIT_SEC As Long = 5
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

    With IE
        .Visible = True
        .navigate "http://performance.morningstar.com/fund/performance-return.action?t=VFINX&region=usa&culture=en_US"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            t = Timer
            Do
                DoEvents
                On Error Resume Next
                Set ele = .querySelectorAll(".r_table3.print97")
                tableCount = ele.Length
                On Error GoTo 0
                If Timer - t > MAX_WAIT_SEC Then Exit Do
            Loop While tableCount < 3

            If Not ele Is Nothing Then
                clipboard.SetText ele.item(1).outerHTML
                clipboard.PutInClipboard
                ws.Cells(1, 1).PasteSpecial
            End If
        End With
        .Quit
    End With
End Sub

image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...