Соскрести стол с веб-страницы - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь очистить таблицу от веб-страницы. Приведенный ниже код попадает в строку Set hTable = html.querySelector, но hTable заканчивается ничем.

Может кто-нибудь посоветовать, как правильно определить таблицу значений на странице?

https://www.morningstar.co.uk/uk/screener/fund.aspx# filtersSelectedValue =% 7B% 22analystRatingScale% 22:% 7B% 22id% 22:% 225% 22% 7D,% 22starRating% 22:% 7B% 22id% 22:% 225% 22% 7D% 7D и страница = 1 & perPage = 10 & sortField = legalName & sortOrder = asc & universeId = FOCAN $$ ALL


    Public Sub GetSomeData()
    Const URL As String = "https://www.morningstar.co.uk/uk/screener/fund.aspx#?filtersSelectedValue=%7B%22analystRatingScale%22:%7B%22id%22:%225%22%7D,%22starRating%22:%7B%22id%22:%225%22%7D%7D&page=1&perPage=10&sortField=legalName&sortOrder=asc&universeId=FOCAN$$ALL"
    Dim html As HTMLDocument, hTable As HTMLTable, ws As Worksheet, headers()
    Dim td As Object, tr As Object, r As Long, c As Long

    headers = Array("Tick", "Fund", "1 Day", "1 Week", "1 Month", "3 Months", "6 Months")
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set html = New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .send
        html.body.innerHTML = .responseText
    End With
    Set hTable = html.querySelector("ID.ec-screener-results-view-container-section-panel-table-securities")


    r = 1
    With ws
        .Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
        For Each tr In hTable.getElementsByTagName("tr")
            r = r + 1: c = 1
            If r > 3 Then
                For Each td In tr.getElementsByTagName("td")
                    .Cells(r - 2, c) = IIf(c = 2, "'" & td.innerText, td.innerText)
                    c = c + 1
                Next
            End If
        Next
    End With
End Sub

1 Ответ

0 голосов
/ 19 января 2020

Поскольку на странице очень много динамических c элементов, вы не можете считывать данные с этой страницы, используя MSXML2.XMLHTTP . Единственный способ - использовать IE или Selenium. Среда, которая может обрабатывать JavaScript.

. Вы можете самостоятельно просмотреть созданный документ HTML и открыть его:

Public Sub GetSomeData()
  Const URL As String = "https://www.morningstar.co.uk/uk/screener/fund.aspx#?filtersSelectedValue=%7B%22analystRatingScale%22:%7B%22id%22:%225%22%7D,%22starRating%22:%7B%22id%22:%225%22%7D%7D&page=1&perPage=10&sortField=legalName&sortOrder=asc&universeId=FOCAN$$ALL"
  Dim html As htmlDocument, hTable As HTMLTable, ws As Worksheet, headers()
  Dim td As Object, tr As Object, r As Long, c As Long

  headers = Array("Tick", "Fund", "1 Day", "1 Week", "1 Month", "3 Months", "6 Months")
  Set ws = ThisWorkbook.Worksheets("Sheet1")
  Set html = New htmlDocument
  With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", URL, False
    .send
    html.body.innerHTML = .responseText
  End With

  '-----
  Open "E:\MorningStar.htm" For Output As #1 'Use your own path
  Print #1, html.body.outerHTML
  Close
  '-----
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...