从网站表中提取标签名称为“table”的数据,而不是其他内容

问题描述 投票:-1回答:1

要导入的数据位于具有标记名称“table”的表中,而不是其他任何内容。

当我在页面中分配所有表格时,我认为它不算作表格。

Sub PullData()

    Dim IE As New SHDocVw.InternetExplorer
    Dim hdoc As MSHTML.HTMLDocument
    Dim HEL As MSHTML.IHTMLElement
    Dim ha, hb, hc, hd, he, hf, hg, hh, hi, hj As String
    Dim i, x As Integer
    i = 2

    IE.Visible = True
    IE.navigate "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=FEL"
    Do While IE.readyState <> READYSTATE_COMPLETE
    Loop

    Set hdoc = IE.document
    Set HEL = hdoc.getElementById("tab8")
    HEL.Click
    Set HEL = hdoc.getElementById("period")
    HEL.Value = "3months"
    Set HEL = hdoc.getElementById("get")
    HEL.Click

End Sub
html excel vba web-scraping
1个回答
0
投票

您可以在URL中使用查询字符串来返回该信息。这意味着您可以直接使用更快的XMLHTTP方法,这比打开浏览器和进行选择要快得多。

Option Explicit

Public Sub GetTable()
    Dim sResponse As String, html As HTMLDocument, clipboard As Object, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=FEL&series=EQ&fromDate=undefined&toDate=undefined&datePeriod=3months", False
        .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    Set html = New HTMLDocument
    html.body.innerHTML = sResponse

    clipboard.SetText html.querySelector("table").outerHTML
    clipboard.PutInClipboard
    ws.Cells(1, 1).PasteSpecial
End Sub

不太整洁是拦截用于文件下载的URL并将其用于二进制下载:

Option Explicit

Public Sub DownloadFile()
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")
    http.Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/getHistoricalData.jsp?symbol=FEL&series=EQ&fromDate=undefined&toDate=undefined&datePeriod=3months&hiddDwnld=true", False
    http.send
    With CreateObject("ADODB.Stream")
        .Open
        .Type = 1
        .write http.responseBody
        .SaveToFile "C:\Users\User\Desktop\TestDownload.csv" '<== specify your path here
        .Close
    End With
    Debug.Print "FileDownloaded"
    Exit Sub
errhand:
    If Err.Number <> 0 Then
        Debug.Print Err.Number, Err.Description
        MsgBox "Download failed"
    End If
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.