Dim html as htmldocument

Загрузка кода страницы с сайта в эксель

Добрый день.
Есть задача: извлечь информацию с некоторых страниц из интернета.

Пользуюсь таким скриптом для передачи кода страницы в string:

sURL = "http://instagram.com/Ballantines_Russia" Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") With oXMLHTTP .Open "GET", sURL, False .send Application.Wait Now + 5 / 86400 txt = .responseText End With Set oXMLHTTP = Nothing

Для некоторых сайтов он работает адекватно, с некоторыми -он не работает ( результат скрипта и результат просмотра браузером- различаются. Сайт не требует для просмотра нужной информации).

Попробовал другим методом- так же не получилось ( даже запрос разный-мне удобен код страницы, а второй алгоритм выдает текст со страницы):

Dim ieDoc As MSHTML.HTMLDocument Dim objCollectionIf As Object Set IE = CreateObject("InternetExplorer.Application") IE.Navigate sURL While IE.busy Or (IE.readyState <> 4) DoEvents Wend Set ieDoc = IE.Document Sheets(DM).Select ActiveSheet.Cells(2, 1) = ieDoc.innerHTML

Подскажите, каким способом лучше воспользоваться?
Во вложении- мой скрипт и результат его работы. Мне нужно увидеть, сколько followers-ов . В примере можно увидеть, что там этого значения нет

Если же метод позволит сначала логиниться, а потом получать код странички- то вообще замечательно.

Загрузка кода страницы HTTPS с сайта в эксель
Пользуюсь вот этим: Public Function GetHTTPResponse(ByVal sURL As String) As String On.

Извлечение данных с сайта и загрузка этих данных в эксель
Всем доброго суток. Вопрос такого плана. Есть подраздел на сайте. В качестве примера рассмотрим.

Загрузка исходного кода страницы
Я думаю все знают, что можно в браузере просматривать исходный код. Правой кнопкой мыши по.

Загрузка страницы сайта в txt документ
Здравствуйте, хотелось бы узнать можно ли с помощью c# скачать страницу с сайта в txt документ, а.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Sub GetInstagramStat() Dim sURL, oXMLHTTP As MSXML2.XMLHTTP, txt sURL = "http://instagram.com/Ballantines_Russia" Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") With oXMLHTTP .Open "GET", sURL, False .send If .Status = 200 Then txt = .responseText Dim h As Long, p As Long, posts, followers, following p = InStr(1, txt, " posts", 1) h = InStr(p - 9, txt, """>", 1) + 2 posts = Mid(txt, h, p - h) p = InStr(1, txt, " followers", 1) h = InStr(p - 9, txt, """>", 1) + 2 followers = Mid(txt, h, p - h) p = InStr(1, txt, " following", 1) h = InStr(p - 9, txt, """>", 1) + 2 following = Mid(txt, h, p - h) End If End With Set oXMLHTTP = Nothing end Sub

P.S. Application.Wait лишнее, т.к. запрос у Вас не асинхронный и код все равно не перейдет на следующую строку, пока не получит результат от страницы. А вот проверять статус, чтобы убедиться в том, что страница загружена все же не помешает.

Дмитрий, привет.
Спасибо за ответ.
Задержку- убрал. Так даже быстрее.
Попробовал ваш скрипт- ругается на

Dim sURL, oXMLHTTP As MSXML2.XMLHTTP, txt

User-defined type not defined. Эта строка- объявление типов, и не обязательна ( как мне кажется). Без неё скрипт выполнился, но.

Проверил я ещё на одном компьютере.
И мой, и ваш скрипт- работают, но на одном из двух моих компьютеров. На обоих- win7, на одном IE8, на другом (на котором работает нормально) IE11.

Есть идеи- почему так может быть и как заставить работать стабильно?

Источник

Как получить содержание интернет страницы (позднее связывание)

Позднее связывание. Получить конкретное окно приложения
Здравствуйте все:) У меня такая проблема: пишу на c# библиотеку в которой содержится форма. На.

TNetHTTPClient. Как получить содержание переадресуемой страницы?
Пытаюсь простым способом NetHTTPClient1.Get(WWW,s); получить запрашиваемую интернет-страницу, но.

Позднее связывание
Доброго времени суток! В программе хочу применить механизм виртуальных функций, но его.

Позднее связывание
Не могу понять казалось бы простую вещь. Позднее связывание на этапе выполнения программы. Вот.

ЦитатаСообщение от boby104 Посмотреть сообщение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Public Function GetHTMLPageByURL(URL$) As String '-------------------------------------------------------------------- ' Функция возвращает тело переданной в URL страницы '-------------------------------------------------------------------- Dim oXMLHTTP As Object Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") With oXMLHTTP .Open "GET", URL, False .send If .Status = 200 Then GetHTMLPageByURL = .responseText ' Тело HTML стр. 'Debug.Print GetHTMLPageByURL End If End With Set oXMLHTTP = Nothing End Function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Public Function GetHTMLPageByURL2(URL$) As String Const READYSTATE_COMPLETE = 4 Dim IE As Object Dim html As Object Dim htmlBody As Variant Set IE = CreateObject("InternetExplorer.Application") 'IE.Top = 0 'IE.Left = 0 'IE.Width = 800 'IE.Height = 600 'IE.Visible = True IE.Visible = False IE.navigate URL$ 'Wait until IE is done loading page Do While IE.ReadyState <> READYSTATE_COMPLETE DoEvents Loop 'HTML document returned Set html = IE.Document GetHTMLPageByURL2 = html.DocumentElement.innerHTML 'IE.Visible = True IE.Quit Set IE = Nothing End Function

Добавлено через 12 минут
Честно:
Второй вариант сворован с сайта: www.cyberfor . ru
удалено модератором

Лучший ответ

Сообщение было отмечено Eugene-LS как решение

Решение

Eugene-LS,
Спасибо большое за оперативный ответ. Я использую вариант, как ваш первый, для получения текста интернет страницы,
но мне нужен объект htmldocument для дальнейшего парсинга страницы по тегам.

Ваш вариант номер два — отвечает моим потребностям, и его можно приспособить под мой проект, но он использует IE. Остается вопрос
htmlDocument и IE.Document — это одно и тоже. Или есть возможность создать htmlDocument , как объект и в дальнейшем его свойству body.innerHTML присвоить содержимое полученное через запрос «MSXML2.XMLHTTP», не запуская IE, или это невозможно?

Добавлено через 11 минут
по моему получилось так

Dim site AS String 'интернет адресс Dim s As String ' содержимое интернет страницы Dim o AS Object 'New WinHttp.WinHttpRequest Dim html As Object 'нужно переделать на позднее связывание SET o = CreateObject("WINHTTP.WinHTTPRequest.5.1") o.Open "GET", site, FALSE o.Send s = o.responseText Set html = CreateObject("htmlFile") html.body.innerHTML = s

ЦитатаСообщение от boby104 Посмотреть сообщение

Ваш вариант номер два — отвечает моим потребностям, и его можно приспособить под мой проект, но он использует IE. Остается вопрос
htmlDocument и IE.Document — это одно и тоже. Или есть возможность создать htmlDocument , как объект и в дальнейшем его свойству body.innerHTML присвоить содержимое полученное через запрос «MSXML2.XMLHTTP», не запуская IE, или это невозможно?

Если я правильно вас понял, — нет.
Вы получаете только текст HTML страницы с её относительными ссылками .
Отобразить её в локальном браузере будет невозможно без дополнительной сложной обработки.

Вот ещё:
Закачка файла по URL (API)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
'-------------------------------------------------------------------- ' Module : modDownloadURL ' Author : es ' Date : 06.05.2013 ' Purpose : Закачка файла по URL (API) '-------------------------------------------------------------------- Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long '-------------------------------------------------------------------- Public Function URLDownLoadOneFile(sFileURL As String, sLocalFilePath As String) As Boolean 'es - 05.05.2013 'Так оно ещё и работает с кешем Браузера! :) '-------------------------------------------------------------------- On Error GoTo URLDownLoadOneFile_Err URLDownLoadOneFile = URLDownloadToFile(0, sFileURL, sLocalFilePath, 0, 0) = 0 URLDownLoadOneFile_Bye: Exit Function URLDownLoadOneFile_Err: 'MsgBox "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _ "in procedure TestDownLoadOneFile", vbCritical, "Error!" Resume URLDownLoadOneFile_Bye End Function
Private Sub URLDownLoadTest() Debug.Print URLDownLoadOneFile("http://msa.polarcom.ru/st/s0000061_Connection_Example_v01.zip", _ "D:\temp\Connection_Example_v01.zip") End Sub

Лучший ответ

Сообщение было отмечено Eugene-LS как решение

Решение

ЦитатаСообщение от Eugene-LS Посмотреть сообщение

Еще раз спасибо, мне как раз и не нужно отображать в браузере, а наоборот получить из интернета
объект типа htmlDocument, распарсить его по тегам и записать найденное в базу данных. Решение
в моем случае найдено

Set html = CreateObject("htmlFile") html.body.innerHTML = s

ЦитатаСообщение от boby104 Посмотреть сообщение

а наоборот получить из интернета
объект типа htmlDocument, распарсить его по тегам и записать найденное в базу данных. Решение
в моем случае найдено

А ясно — что то вроде этого:
Импорт курса валюты с сайта ЦБ РФ
По материалам: http://www.cyber. 116.html

?GetCurrencyRate("EUR") ?GetCurrencyRate("USD") ?GetCurrencyRate("EUR", #01/01/2018#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
Public Function GetCurrencyRate(sCurrencyName As String, Optional vDate As Variant = Null) As Currency ' Курс берётся по адресу http://www.cbr.ru/currency_base/D_print.aspx?date_req=dd.mm.yyyy '-------------------------------------------------------------------------- 'Аргументы: ' sCurrencyName = Трёх буквенное обозначение валюты "USD", "EUR" и т.п. ' vDate = Опционально Дата на которую - по умолчанию = Текущаяя '-------------------------------------------------------------------------- Dim sURI As String, oHttp As Object, HTMLcode, OutStr As String Dim sDate As String, m As String, y As String, divider As Currency Dim foundRate As String, foundCount As String Dim pLeft As Long, pRight As Long '-------------------------------------------------------------------------- On Error GoTo GetCurrencyRate_Err If IsNull(vDate) Then vDate = Date 'если дата не указана = Сегодня! sDate = Format(vDate, "dd\/mm\/yyyy\") sURI = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & sDate 'Debug.Print sURI Set oHttp = CreateObject("MSXML2.XMLHTTP") oHttp.Open "GET", sURI, False oHttp.Send HTMLcode = oHttp.ResponseText 'Debug.Print HTMLcode ' определяем начало строки с искомым кодом валюты pLeft = InStr(InStr(1, HTMLcode, sCurrencyName) + 3, HTMLcode, "") + Len("") ' выделяем число едениц за которое указана цена pRight = InStr(pLeft, HTMLcode, "Nominal>") foundCount = Mid(HTMLcode, pLeft, pRight - pLeft) ' между этими скобками находится цифра в виде строки, которая является количеством единиц валюты, преобразовываем в число divider = val(foundCount) ' ищем курс валюты pLeft = InStr(pRight, HTMLcode, "Value") + Len("/Value") pRight = InStr(pLeft, HTMLcode, "/Value") - 1 foundRate = Mid(HTMLcode, pLeft, pRight - pLeft) ' берём символы курса валюты между этих границ, преобразовываем в тип Double и делим на количество единиц валюты GetCurrencyRate = CCur(foundRate) / divider 'На некоторые валюты курс выставляется не кратный 1, поэтому делим на кратность курса GetCurrencyRate_End: On Error Resume Next Set oHttp = Nothing Exit Function GetCurrencyRate_Err: MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetCurrencyRate", vbCritical Err.Clear Resume GetCurrencyRate_End End Function

Eugene-LS, Еще раз спасибо.
Частная задачка была решена. теперь нужно работать еще и с другим сайтом.
Не хватает знаний по работе с html файлом.
В вашем последнем примере с сайта получается
html страница в формате строки.
вариант

SET o = CreateObject("WINHTTP.WinHTTPRequest.5.1") o.Open "GET", site, FALSE o.Send s = o.responseText Set html = CreateObject("htmlFile") html.body.innerHTML = s

передает html страницу в переменную, как объект- html файл.
теперь с ним можно работать обращаясь напрямую к тегам.
типа

html.getElementsByTagName("tr")

Источник

Читайте также:  Javascript framework for rest
Оцените статью