[/vba] Супер строка. Мощный вариант. Смотрю, новый для меня объект подключился ("Scripting.Dictionary"). Буду изучать. Эх, братцы, откуда ж вы все это знаете то? И как же это всё в вашей голове умещается ? fantastic tales.
Единственно, не понял, в коде вроде как форматирование данных идёт, а вот на страницу почему то всё как строка выгрузилось В каждой ячейке по зелёному треугольничку нарисовалось.
[/vba] Супер строка. Мощный вариант. Смотрю, новый для меня объект подключился ("Scripting.Dictionary"). Буду изучать. Эх, братцы, откуда ж вы все это знаете то? И как же это всё в вашей голове умещается ? fantastic tales.
Единственно, не понял, в коде вроде как форматирование данных идёт, а вот на страницу почему то всё как строка выгрузилось В каждой ячейке по зелёному треугольничку нарисовалось.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
С форматом просто. Встречаеется в строке три типа данных [vba]
Код
Private Function FT(X) If Len(X) - Len(Replace(X, " ", "")) = 2 Then FT = -1: Exit Function ' если дата If Len(X) - Len(Replace(X, ",", "")) = 2 Then FT = Replace(X, ",", ""): Exit Function 'если 2 запятые FT = Replace(Replace(X, ",", ""), ".", ",") 'иначе если одна запятая End Function
[/vba] Не понятный формат с 2 запятыми и во что его преообразовывать Последняя строка формат с 1 точкой и одной запятой. Напрямую в ексел не влезет. Можно во второй и третьей строке сделать преобразование данных [vba]
Код
If Len(X) - Len(Replace(X, ",", "")) = 2 Then FT = CDbl(Replace(X, ",", "")): Exit Function 'если 2 запятые FT = CDbl(Replace(Replace(X, ",", ""), ".", ",")) 'иначе если одна запятая
[/vba] И, кстати, проверку окончания таблицы надо перенести вверх. Иначе если преодразовать в Дабл, то ошибка выелет [vba]
Код
For Each D2 In D1.GetElementsByTagName("td") If InStr(1, D2.innertext, "Close", vbTextCompare) > 0 Then GoTo 1 End If
[/vba] Сорри. Забыл, что данные опять сплитятся (а значит опять станут текстом) Привести к дабл нужно тут:
[vba]
Код
For a = 1 To 6 X(i + 1, a + 1) =cdbl( T(a)) Next a
[/vba]
С форматом просто. Встречаеется в строке три типа данных [vba]
Код
Private Function FT(X) If Len(X) - Len(Replace(X, " ", "")) = 2 Then FT = -1: Exit Function ' если дата If Len(X) - Len(Replace(X, ",", "")) = 2 Then FT = Replace(X, ",", ""): Exit Function 'если 2 запятые FT = Replace(Replace(X, ",", ""), ".", ",") 'иначе если одна запятая End Function
[/vba] Не понятный формат с 2 запятыми и во что его преообразовывать Последняя строка формат с 1 точкой и одной запятой. Напрямую в ексел не влезет. Можно во второй и третьей строке сделать преобразование данных [vba]
Код
If Len(X) - Len(Replace(X, ",", "")) = 2 Then FT = CDbl(Replace(X, ",", "")): Exit Function 'если 2 запятые FT = CDbl(Replace(Replace(X, ",", ""), ".", ",")) 'иначе если одна запятая
[/vba] И, кстати, проверку окончания таблицы надо перенести вверх. Иначе если преодразовать в Дабл, то ошибка выелет [vba]
Код
For Each D2 In D1.GetElementsByTagName("td") If InStr(1, D2.innertext, "Close", vbTextCompare) > 0 Then GoTo 1 End If
[/vba] Сорри. Забыл, что данные опять сплитятся (а значит опять станут текстом) Привести к дабл нужно тут:
[vba]
Код
For a = 1 To 6 X(i + 1, a + 1) =cdbl( T(a)) Next a
Использовал код ( Сообщение № 8 ) для выгрузки на лист данных, полученных запросчиком ( Сообщение № 6). Раза три всё работало как часы (правда несколько медленно) и тут возник камень преткновения сразу на первом инструменте в виде:
Использовал код ( Сообщение № 8 ) для выгрузки на лист данных, полученных запросчиком ( Сообщение № 6). Раза три всё работало как часы (правда несколько медленно) и тут возник камень преткновения сразу на первом инструменте в виде:
Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "res://mshtml.dll/blank.htm" objIE.Document.Write T
[/vba]
так:
[vba]
Код
Set objIE = CreateObject("htmlfile") objIE.Write T
Cells.ClearContents For Each HE In objIE.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next
[/vba]
попробуй вместо Ишачка [vba]
Код
Set objIE = CreateObject("InternetExplorer.Application") objIE.navigate "res://mshtml.dll/blank.htm" objIE.Document.Write T
[/vba]
так:
[vba]
Код
Set objIE = CreateObject("htmlfile") objIE.Write T
Cells.ClearContents For Each HE In objIE.getElementsByTagName("tr") R = R + 1 C = 0 For Each HB In HE.Cells C = C + 1: Cells(R, C) = HB.innertext Next Next
Попробовал. Отработало хорошо!!! Но прикол в том, что прежде чем пробовать новый вариант (вместо Ишачка), я опять, уже сегодня на новый день, попробовал старый вариант. Опять всё отработало на "Ура" раза 4 и встало колом. В чём прикол? Здесь должна быть какая-то причина. Было бы неплохо в этом разобраться.
Попробовал. Отработало хорошо!!! Но прикол в том, что прежде чем пробовать новый вариант (вместо Ишачка), я опять, уже сегодня на новый день, попробовал старый вариант. Опять всё отработало на "Ура" раза 4 и встало колом. В чём прикол? Здесь должна быть какая-то причина. Было бы неплохо в этом разобраться. Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Среда, 19.11.2014, 13:38
alex77755, ты очень уверенно пользуешься методом getElementsByName для извлечения информации из HTML страницы. Глядя на твои примеры, решил "набить руку" по данному методу выборки. Регулярки как-то посложнее будут. Но пока смотрю в твои примеры - всё понятно. Как пробую сам - тёмный лес. К примеру, простая страница http://www.msoffice.nm.ru/faq/macros.htm.. Решил потренироваться. Создал запросчик, получил страницу. Хотел вывести список на лист Excel и забуксовал.
Есть по данному вопросу какие-нибудь книги, статьи, примеры? (Бывает, что в какой-нибудь книжке сидит одна одинокая глава, и ни за что про неё не узнаешь, если кто знающий не подскажет). Можешь посоветовать что-нибудь? Два дня просидел в гугле, глаза в кучу, так ничего и не нашёл.
alex77755, ты очень уверенно пользуешься методом getElementsByName для извлечения информации из HTML страницы. Глядя на твои примеры, решил "набить руку" по данному методу выборки. Регулярки как-то посложнее будут. Но пока смотрю в твои примеры - всё понятно. Как пробую сам - тёмный лес. К примеру, простая страница http://www.msoffice.nm.ru/faq/macros.htm.. Решил потренироваться. Создал запросчик, получил страницу. Хотел вывести список на лист Excel и забуксовал.
Есть по данному вопросу какие-нибудь книги, статьи, примеры? (Бывает, что в какой-нибудь книжке сидит одна одинокая глава, и ни за что про неё не узнаешь, если кто знающий не подскажет). Можешь посоветовать что-нибудь? Два дня просидел в гугле, глаза в кучу, так ничего и не нашёл.Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Это всё очень здорово. Спасибо. Но это справочная информация. А мне бы учебную бы, типа Д.Уокенбаха, Б.Джелена или ещё кого. Вообще, начал VBA осваивать и заметил отсутствие учебной наглядной информации. Раньше Web дизайном промышлял, так дефицита в инфе на начальном этапе вообще не испытывал. И статьи, и видеоуроки, и видеокурсы. По VBA можно сказать - вообще ничего нет, а точнее - по использованию в его контексте других технологий типа VBScript и т.д..
Это всё очень здорово. Спасибо. Но это справочная информация. А мне бы учебную бы, типа Д.Уокенбаха, Б.Джелена или ещё кого. Вообще, начал VBA осваивать и заметил отсутствие учебной наглядной информации. Раньше Web дизайном промышлял, так дефицита в инфе на начальном этапе вообще не испытывал. И статьи, и видеоуроки, и видеокурсы. По VBA можно сказать - вообще ничего нет, а точнее - по использованию в его контексте других технологий типа VBScript и т.д..
Решил потренироваться. Создал запросчик, получил страницу. Хотел вывести список на лист Excel и забуксовал.
А для этого сайта так и будет. Где вы там увидели кучу элементов с именами Только эти присутствуют META name="author" META name="keywords" META name="description"
Решил потренироваться. Создал запросчик, получил страницу. Хотел вывести список на лист Excel и забуксовал.
А для этого сайта так и будет. Где вы там увидели кучу элементов с именами Только эти присутствуют META name="author" META name="keywords" META name="description"doober
А для этого сайта так и будет. Где вы там увидели кучу элементов с именами Только эти присутствуют
Похоже все дороги ведут таки к регулярным выражениям? Кстати, Вы регулярки в ручную мастерите, или пользуетесь каким-нибудь волшебным Он-лайн сервисом?
А для этого сайта так и будет. Где вы там увидели кучу элементов с именами Только эти присутствуют
Похоже все дороги ведут таки к регулярным выражениям? Кстати, Вы регулярки в ручную мастерите, или пользуетесь каким-нибудь волшебным Он-лайн сервисом?Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Set aTable = HTML.GetElementsByTagName("ol").Item(0) For Each TB In aTable.all If Left(TB.innertext, 2) = "XL" Or Left(TB.innertext, 3) = "VBA" Then J = J + 1 Cells(J, 1) = TB.innertext End If Next
[/vba]
Например так: [vba]
Код
Set aTable = HTML.GetElementsByTagName("ol").Item(0) For Each TB In aTable.all If Left(TB.innertext, 2) = "XL" Or Left(TB.innertext, 3) = "VBA" Then J = J + 1 Cells(J, 1) = TB.innertext End If Next
Set aTable = objHTML.GetElementsByTagName("ol").Item(0) For Each TB In aTable.GetElementsByTagName("li") J = J + 1 Cells(J, 1) = TB.innerText Next
[/vba]Чтобы захватить все названия всех тем и заголовков. Но фильтр похоже нужен, но специфический. Хотелось бы удалить по ходу движения тег переноса <BR>, так как он уродует картинку:
И тег <HR> похоже тоже уродует туже картинку. А тег <B> оставить, так как он даёт заголовок раздела:
Кстати, а есть альтернатива .innerText ? Он выдаёт только текст, а сами ссылки как-то сохранить реально?
Взял так. [vba]
Код
Set aTable = objHTML.GetElementsByTagName("ol").Item(0) For Each TB In aTable.GetElementsByTagName("li") J = J + 1 Cells(J, 1) = TB.innerText Next
[/vba]Чтобы захватить все названия всех тем и заголовков. Но фильтр похоже нужен, но специфический. Хотелось бы удалить по ходу движения тег переноса <BR>, так как он уродует картинку:
И тег <HR> похоже тоже уродует туже картинку. А тег <B> оставить, так как он даёт заголовок раздела:
Кстати, а есть альтернатива .innerText ? Он выдаёт только текст, а сами ссылки как-то сохранить реально?Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Суббота, 22.11.2014, 12:58
Чтобы не рыться по страницам, для систематизации в теме, приведём два вида запросчиков, которые мы рассмотрели для импорта WEB страниц для последующего извлечения данных.
Sub Get_Web() 'На примере http://finance.yahoo.com Dim DATA As String, XMLHTTP As Object Dim URL As String URL = "http://finance.yahoo.com/q/hp?s=%5EDJI&a=08&b=01&c=2013&d=10&e=7&f=2014&g=d" Set XMLHTTP = CreateObject("MSXML2.XMLHTTP") 'CreateObject("Microsoft.XMLHTTP") With XMLHTTP .Open "GET", URL, False .setRequestHeader "Accept", "text/plain, */*; q=0.01" .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .setRequestHeader "Host", "finance.yahoo.com" .setRequestHeader "Accept-Encoding", "gzip,deflate" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .setRequestHeader "Accept-Language", "uk-UA,uk;q=0.8,ru;q=0.6,en-US;q=0.4,en;q=0.2,de;q=0.2" .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36" .send End With
DATA = XMLHTTP.responseText Debug.Print DATA
Set XMLHTTP = Nothing End Sub
[/vba]
Чтобы не рыться по страницам, для систематизации в теме, приведём два вида запросчиков, которые мы рассмотрели для импорта WEB страниц для последующего извлечения данных.
Запросчик методом POST. На примере сайта http://ru.investing.com (По объёму биржевой информации (ИМХО) самый большой сайт).
[vba]
Код
Sub POST_Web() 'На примере http://ru.investing.com Dim DATA As String, XMLHTTP As Object Const URL As String = "http://ru.investing.com/instruments/HistoricalDataAjax" Dim CurrId As String, dateFrom As String, dateTo As String, Interval As String
Set XMLHTTP = Nothing 'INVESTING.COM. СТРУКТУРА ЗАПРОСА: '============================================================================ 'http://ru.investing.com/instruments/HistoricalDataAjax 'action: historical_data 'curr_id: 166 'КОД ФИНАНСОВОГО ИНСТРУМЕНТА 'st_date: 07/10/2014 st_date: 07%2F10%2F2014 'ДАТА НАЧАЛА ПЕРИОДА ЗАГРУЗКИ 'end_date: 06/11/2014 end_date: 06%2F11%2F2014 'ДАТА ОКОНЧАНИЯ ПЕРИОДА ЗАГРУЗКИ 'interval_sec: Daily ' ТАЙМФРЕЙМ '------------------------------------------------------------------------------------------------------------------------------------------ 'action=historical_data&curr_id=166&st_date=07%2F10%2F2014&end_date=06%2F11%2F2014&interval_sec=Daily 'оригинальная ссылка '------------------------------------------------------------------------------------------------------------------------------------------ '"action=historical_data & curr_id=" & CurrId & "& st_date=" & dateFrom & "& end_date=" & dateTo & "& interval_sec=" & Interval & "" 'сформированная с наличием переменных '============================================================================= End Sub
[/vba]
Запросчик методом POST. На примере сайта http://ru.investing.com (По объёму биржевой информации (ИМХО) самый большой сайт).
[vba]
Код
Sub POST_Web() 'На примере http://ru.investing.com Dim DATA As String, XMLHTTP As Object Const URL As String = "http://ru.investing.com/instruments/HistoricalDataAjax" Dim CurrId As String, dateFrom As String, dateTo As String, Interval As String
Почему бы и нет? Только в данном случае они не "в чистом виде". Надо дописывать . Без фильтра все ссылки. Опять же при желании можно добавить фильтр [vba]
Код
For Each TB In HTML.Links J = J + 1 If Len(TB.innertext) > 0 Then ActiveSheet.Hyperlinks.Add Anchor:=Cells(J, 1), Address:= _ "http://www.msoffice.nm.ru/faq/" & Replace(TB.href, "about:", ""), _ TextToDisplay:=TB.innertext Cells(J, 2) = "http://www.msoffice.nm.ru/faq/" & Replace(TB.href, "about:", "") End If Next
[/vba]
Цитата
а сами ссылки как-то сохранить реально?
Почему бы и нет? Только в данном случае они не "в чистом виде". Надо дописывать . Без фильтра все ссылки. Опять же при желании можно добавить фильтр [vba]
Код
For Each TB In HTML.Links J = J + 1 If Len(TB.innertext) > 0 Then ActiveSheet.Hyperlinks.Add Anchor:=Cells(J, 1), Address:= _ "http://www.msoffice.nm.ru/faq/" & Replace(TB.href, "about:", ""), _ TextToDisplay:=TB.innertext Cells(J, 2) = "http://www.msoffice.nm.ru/faq/" & Replace(TB.href, "about:", "") End If Next
alex77755, спасибо за наводящие советы. А вот то, что собственно хотелось получить. (Конечно возможны украшения)
Каждая строка - ссылка на соответствующую страницу в Сети.
[vba]
Код
Private Sub Get_List_FAQ() Dim NextRow As Long, objHTML As Object, aTable As Object, URL As String Dim TB, DATA As String
Application.ScreenUpdating = False
URL = "http://www.msoffice.nm.ru/faq/macros.htm" 'FAQ макросы DATA = List_FAQ(URL) 'получаем код страницы через функцию List_FAQ
Cells.Delete
Set objHTML = CreateObject("htmlfile") objHTML.write DATA
Set aTable = objHTML.GetElementsByTagName("ol").Item(0)
For Each TB In aTable.all 'перебираем все теги, исключая ненужные (<A>, <SUP>, <STRONG>) NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 If TB.nodeName <> "A" And TB.nodeName <> "SUP" And TB.nodeName <> "STRONG" Then
Select Case TB.nodeName Case "B" 'ИЗВЛЕКАЕМ ЗАГОЛОВОК ТЕМЫ With Cells(NextRow, 1) .Value = Replace(TB.innerText, vbCrLf, "") .Font.Color = RGB(153, 0, 0) .Font.Size = 13 .Font.Bold = True End With
Case Else 'ИЗВЛЕКАЕМ ВСЕ ВОПРОСЫ В КАЖДОЙ ТЕМЕ Cells(NextRow, 1) = Replace(TB.innerText, vbCrLf, "") 'УБИРАЕМ В СТРОКЕ ПЕРЕНОС, ЧТОБЫ СТРОКА БЫЛА ЕДИНОЙ
If Len(TB.innerText) > 0 Then ActiveSheet.Hyperlinks.Add Anchor:=Cells(NextRow, 1), _ Address:="http://www.msoffice.nm.ru/faq/" & Split(TB.innerHTML, """")(1), _ ScreenTip:="Перейти на сайт" End If
End Select End If
Next TB
Set objHTML = Nothing Application.ScreenUpdating = True End Sub
[/vba]
Файл Excel прилагается. Собственно, данный код - это пример извлечения данных, полученных Запросчиком, с помощью анализа полученного HTML кода страницы. Для анализа кода страницы, в помощь - Document Object Model. Кстати, очень удобно сохранить код загруженной Запросчиком страницы в формате .html, а потом разглядывать его в Notepad++ в поисках нужных элементов. В этом редакторе html код подсвечивается, очень удобно. Таким образом можно извлекать любую биржевую информацию с любого сайта.
Теперь осталось освоить регулярные выражения
alex77755, спасибо за наводящие советы. А вот то, что собственно хотелось получить. (Конечно возможны украшения)
Каждая строка - ссылка на соответствующую страницу в Сети.
[vba]
Код
Private Sub Get_List_FAQ() Dim NextRow As Long, objHTML As Object, aTable As Object, URL As String Dim TB, DATA As String
Application.ScreenUpdating = False
URL = "http://www.msoffice.nm.ru/faq/macros.htm" 'FAQ макросы DATA = List_FAQ(URL) 'получаем код страницы через функцию List_FAQ
Cells.Delete
Set objHTML = CreateObject("htmlfile") objHTML.write DATA
Set aTable = objHTML.GetElementsByTagName("ol").Item(0)
For Each TB In aTable.all 'перебираем все теги, исключая ненужные (<A>, <SUP>, <STRONG>) NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 If TB.nodeName <> "A" And TB.nodeName <> "SUP" And TB.nodeName <> "STRONG" Then
Select Case TB.nodeName Case "B" 'ИЗВЛЕКАЕМ ЗАГОЛОВОК ТЕМЫ With Cells(NextRow, 1) .Value = Replace(TB.innerText, vbCrLf, "") .Font.Color = RGB(153, 0, 0) .Font.Size = 13 .Font.Bold = True End With
Case Else 'ИЗВЛЕКАЕМ ВСЕ ВОПРОСЫ В КАЖДОЙ ТЕМЕ Cells(NextRow, 1) = Replace(TB.innerText, vbCrLf, "") 'УБИРАЕМ В СТРОКЕ ПЕРЕНОС, ЧТОБЫ СТРОКА БЫЛА ЕДИНОЙ
If Len(TB.innerText) > 0 Then ActiveSheet.Hyperlinks.Add Anchor:=Cells(NextRow, 1), _ Address:="http://www.msoffice.nm.ru/faq/" & Split(TB.innerHTML, """")(1), _ ScreenTip:="Перейти на сайт" End If
End Select End If
Next TB
Set objHTML = Nothing Application.ScreenUpdating = True End Sub
[/vba]
Файл Excel прилагается. Собственно, данный код - это пример извлечения данных, полученных Запросчиком, с помощью анализа полученного HTML кода страницы. Для анализа кода страницы, в помощь - Document Object Model. Кстати, очень удобно сохранить код загруженной Запросчиком страницы в формате .html, а потом разглядывать его в Notepad++ в поисках нужных элементов. В этом редакторе html код подсвечивается, очень удобно. Таким образом можно извлекать любую биржевую информацию с любого сайта.
Теперь осталось освоить регулярные выражения Vostok
В процессе отладки кода столкнулся с "казусом" окна Immediate. После отработки Приведённых в теме запросчиков картинка в окне Immediate (debug.Print DATA) менялась не только от объёма загружаемых данных, но и как мне показалось, весьма странным способом. В частности, при увеличении объёма загружаемых данных в окно подавались какие-то обрезанные "куски" HTML. Сразу было видно, что выводится какой то обрезок. В чём секрет? У этого окна есть какие-то тонкие настройки или это может зависеть от специфики запросчика?
В процессе отладки кода столкнулся с "казусом" окна Immediate. После отработки Приведённых в теме запросчиков картинка в окне Immediate (debug.Print DATA) менялась не только от объёма загружаемых данных, но и как мне показалось, весьма странным способом. В частности, при увеличении объёма загружаемых данных в окно подавались какие-то обрезанные "куски" HTML. Сразу было видно, что выводится какой то обрезок. В чём секрет? У этого окна есть какие-то тонкие настройки или это может зависеть от специфики запросчика?Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Среда, 26.11.2014, 09:18
[moder]Позасоряйте. А предварительно Правила форума почитайте На этот вопрос в этой теме просьба не отвечать. Тему не закрываю только потому, что ее пока, вроде, не полностью закончили.
[moder]Позасоряйте. А предварительно Правила форума почитайте На этот вопрос в этой теме просьба не отвечать. Тему не закрываю только потому, что ее пока, вроде, не полностью закончили.Varvar2011
Сообщение отредактировал Varvar2011 - Вторник, 25.11.2014, 18:10