Импорт данных из гиперссылки на веб-странице в Excel с использованием макросов - PullRequest
0 голосов
/ 05 мая 2020

Я хочу импортировать данные с веб-сайта https://www.amfiindia.com/nav-history-download. На этой странице есть ссылка «Загрузить полный отчет NAV в текстовом формате», по которой я могу получить необходимые данные. Но эта ссылка не является stati c, поэтому я не могу использовать ее непосредственно в VBA для загрузки своих данных. Итак, как загрузить данные из гиперссылки на веб-странице с помощью Excel?

Мой подход заключается в том, чтобы сначала получить гиперссылку в переменной, а затем использовать эту переменную для получения данных?

  1. Во-первых, получить гиперссылку, используя функцию getElementsByTagName, как показано ниже.
  2. Затем используйте это как URL-адрес для получения данных.
  3. Но я получаю ошибку несоответствия типа при приравнивании веб-сайта, который представляет собой строку к моему гиперссылка.

Я не знаю тип href. Пытался увидеть в окне просмотра Variant, попытался исправить ошибку. Пожалуйста, помогите мне с этим.




Sub webscraping()

Dim request As Object
Dim response As String
Dim html As New HTMLDocument
Dim website As String
Dim price As Variant
Dim cellAddress As String
Dim rowNumber As Long

Dim ie As InternetExplorer
Dim ht As HTMLDocument
Dim hr As MSHTML.IHTMLElement
'Dim Hra As MSHTML.IHTMLElement



Set ie = New InternetExplorer
ie.Visible = True
ie.Navigate ("https://www.amfiindia.com/nav-history-download")

Do Until ie.ReadyState >= 4
        DoEvents
Loop

Set ht = ie.Document

'MsgBox ht.getElementById("navhistorydownload")

Set hr = ht.getElementsByTagName("a")(18).href


' Website to go to.
website = StrConv(hr, vbUnicode)

' Create the object that will make the webpage request.
Set request = CreateObject("MSXML2.XMLHTTP")

' Where to go and how to go there - probably don't need to change this.
request.Open "GET", website, False

' Get fresh data.
request.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"

' Send the request for the webpage.
request.send

' Get the webpage response data into a variable.
response = StrConv(request.responseBody, vbUnicode)

' Put the webpage into an html object to make data references easier.
html.body.innerHTML = response

' Get the price from the specified element on the page.
'price = html.getElementstagName("a").Item(0).innerText

cellAddress = Range("A" & Rows.Count).End(xlUp).Address
rowNumber = Range(cellAddress).Row

ThisWorkbook.Sheets(1).Cells(rowNumber + 1, 1) = response
' MsgBox rowNumber
' MsgBox cellAddress
' Output the price into a message box.
'MsgBox price

End Sub

1 Ответ

1 голос
/ 05 мая 2020

Если вы не знаете тип, вы можете использовать

?typename(ht.getElementsByTagName("a")(18).href) 

в непосредственном окне.

Это должна быть строка и объявлена ​​как таковая.

Вместо индексации в коллекцию привязок я бы взял css селектор

ht.querySelector(".nav-hist-dwnld a").href

Это указывает родительский узел с именем класса nav-hist-dwnld, а затем запрашивает первый дочерний тег a.

Это, website = StrConv(hr, vbUnicode) не требуется. Используйте извлеченный href прямой.

...