Как очистить сайт в Excel / Google Sheets? - PullRequest
1 голос
/ 02 июня 2019

Как мне почистить эту веб-страницу https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/ и, в частности, нужна цифра ROE, указанная в таблице?

Я использовал следующий код в Excel. Я не знаю много о Google Sheets Scraping

 Sub FetchData()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/", Destination:=Range( _
        "$A$1"))
        .Name = "www"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

Я не смог правильно загрузить данные.

Любые предложения / помощь по этому вопросу? Нужна икра на фигуре, остальное от нее не требуется.

Ответы [ 3 ]

0 голосов
/ 02 июня 2019

К сожалению, это невозможно, поскольку сайт управляется JavaScript, а Google Sheets не может понять / импортировать JS.Вы можете проверить это, просто отключив JS для данной ссылки, и вы увидите пустую страницу:

0

все, что вы можете получить, это то, что вы видите:

=ARRAY_CONSTRAIN(IMPORTDATA("https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/"), 5000, 15)
0 голосов
/ 02 июня 2019

Используйте API, чтобы страница использовала его намного быстрее. Вы можете использовать powerquery для обработки ответа json, парсера json или просто использовать split. Поместите код в стандартный модуль и ссылку на кнопку, если вы хотите обновить при нажатии кнопки.

Option Explicit
Public Sub GetInfo()
    Dim s As String, ids(), i As Long
    ids = Array(500820, 500312, 500325, 532540)
    With CreateObject("MSXML2.XMLHTTP")
        For i = LBound(ids) To UBound(ids)
            .Open "GET", "https://api.bseindia.com/BseIndiaAPI/api/ComHeader/w?quotetype=EQ&scripcode=" & ids(i) & "&seriesid=", False
            .send
            s = .responseText
            ActiveSheet.Cells(i + 1, 1) = Split(Split(s, """ROE"":""")(1), Chr$(34))(0)
        Next
    End With
End Sub
0 голосов
/ 02 июня 2019

Вот как мне легче получить это конкретное значение. Как только for loop обнаружит ROE, оно пойдет за требуемое значение и выйдет из цикла, так как они оба находятся в одном родительском узле.

Sub FetchData()
    Dim IE As New InternetExplorer, post As Object
    Dim Html As HTMLDocument, elem As Object

    With IE
        .Visible = False
        .navigate "https://www.bseindia.com/stock-share-price/asian-paints-ltd/asianpaint/500820/"
        While .Busy Or .readyState < 4: DoEvents: Wend
        Set Html = .document
    End With

    For Each post In Html.getElementsByTagName("td")
        If post.innerText = "ROE" Then
            Set elem = post.ParentNode.querySelector(".textvalue")
            Exit For
        End If
    Next post

    [A1] = elem.innerText
End Sub

Ссылки для добавления:

Microsoft Html Object Library
Microsoft Internet Controls
...