макрос во вложенном файле... что сделано: 1. запрос GET (к Yield Curve Еврозоны) - на сайт http://markets.ft.com/data/bonds (на сайте Еврозона выбирается по выпадающему списку) 2. перекодировка UTF-8 в windows-1250... chr(60) и chr(62) странно себя ведут - поэтому Replace на норму <> 3. парсинг по примеру отсюда (4) корректировка выходного массива... (если её раскомментировать - то всё раскладывается по ячейкам, как надо)... ((5)) в принципе выгрузка
что не нравится: 1. возможность наличия двойственной информации - (тогда и в тэги разные заключаются цифры либо их отсутствие) - КАК рассмотреть 2 варианта ВАЖНО: с возможностью запихать их в Submatches?.. вариант "|"(или) почему-то не проходит... Очень хотелось бы обойтись без корректировки массива, только одним регулярным выражением... но можно ли как-то без этих граблей обойтись?? p.s. и правильно ли я подошла к <> через Replace или есть более совершенный метод побороть странности перекодировки?? может быть, чей-нибудь свежий взгляд добавит ювелирности изделию ... по коду знаками ??????? отмечены места, которые не нравятся (их всего 3)... Заранее спасибо
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
думаю, без этого можно обойтись (при правильной функции перекодировки) сколько парсил - никаких проблем не было я конвертировал в Windows-1251 этой функцией
Код
Function DecodeUTF8(ByVal sInput) As String
' взято отсюда: http://bbs.vbstreets.ru/viewtopic.php?p=6659672#p6659672
On Error Resume Next
Dim iCharPos&, iCharCode&, iLoByteCounter&, iLoByteCount&, iLoCharCode&
Dim iInputLen&: iInputLen = Len(sInput)
ReDim aUnicode(iInputLen)
For iCharPos = 1 To iInputLen
aUnicode(iCharPos) = Mid(sInput, iCharPos, 1)
iCharCode = Asc(aUnicode(iCharPos))
If (iCharCode > 191) Then
If (iCharCode < 224) Then '110xxxxx prefix for 2 bytes unicode
iCharCode = iCharCode And 31 'remove the 3 bit two bytes prefix
iLoByteCount = 1
ElseIf (iCharCode < 240) Then '1110xxxx prefix for 3 bytes unicode
iCharCode = iCharCode And 15 'remove the 4 bit three bytes prefix
iLoByteCount = 2
ElseIf (iCharCode < 248) Then '11110xxx prefix for 4 bytes unicode
iCharCode = iCharCode And 7 'remove the 5 bit four bytes prefix
iLoByteCount = 3
ElseIf (iCharCode < 252) Then '111110xx prefix for 5 bytes unicode
iCharCode = iCharCode And 3 'remove the 6 bit five bytes prefix
iLoByteCount = 4
Else '1111110x prefix for 6 bytes unicode
iCharCode = iCharCode And 1 'remove the 7 bit six bytes prefix
iLoByteCount = 5
End If
For iLoByteCounter = 1 To iLoByteCount
iLoCharCode = Asc(Mid(sInput, iCharPos + iLoByteCounter, 1)) 'the next byte
'сдвиг влево на 6 битов + 6 младших битов следующего символа
iCharCode = iCharCode * 64 + (iLoCharCode And 63)
Next
aUnicode(iCharPos) = ChrW(iCharCode)
iCharPos = iCharPos + iLoByteCount
End If
Next
DecodeUTF8 = Join(aUnicode, "")
End Function
а насчет этого:
Цитата
возможность наличия двойственной информации - (тогда и в тэги разные заключаются цифры либо их отсутствие)
покажите 2 куска HTML кода (как будет без тегов. и как с тегами) тогда будет и совет
Игорь написал: покажите 2 куска HTML кода (как будет без тегов. и как с тегами)
Игорь спасибо за свежие идеи... хотя у меня почему-то вылезли китайские иероглифы от такого кода (под спойлером)
.responseBody
Код
Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
With XMLHTTP
.Open "GET", URL, False
.setRequestHeader "If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 UTC"
.setRequestHeader "Accept-Encoding", "gzip, deflate"
.setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
.setRequestHeader "Accept-Language", "ru-RU"
.setRequestHeader "Content-Type", "application/json; charset=utf-8"
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
.setRequestHeader "Referer", "http://markets.ft.com/data/bonds"
.send
'Debug.Print .responseBody
If .statustext = "OK" Or .Status = 200 Then'
S = DecodeUTF8(.responseBody)
End If
ThisWorkbook.Sheets("rates").[a1] = S
End with
а S = DecodeUTF8(.responseText) - проблемы <> (chr(60)) и (chr(62)) - остаются... *** два куска там по коду - один как есть, 2-й закоментирован (когда есть число - оно обрамляется тегами... видно в районе окончания работающего RE строкой ниже в закоментированном... (от хвоста читать удобнее, чтобы увидеть новые теги, хотя они во вложенном файле и в ячейках лежат)... как-то так, а (.+?) - это направление изменения (pos+, neg-, neu нет изменений за день) И цифра, на сколько изменилось Тэги: <td><spanclass=\mod-format--neg\>>-0.01</span></td> или просто <td>--</td> (если --) ... различия только в этом, остальное регулярно
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, добрый вечер. Для регулярок проще будет, когда переменная с текстом для обработки постоянна, за исключением данных, которые вытаскиваем регулярками. В таком случае можно не побояться дополнительных replace. У меня по сути получилось проще, набросал на скорую руку:
Код
S = Replace(S, "pos", "")
S = Replace(S, "neg", "")
S = Replace(S, "neu", "")
S = Replace(S, "</span>", "")
S = Replace(S, "<spanclass=mod-format-->", "")
что-то не хочет кушать... я кстати \ (chr92) убирала, потому что с ними мой паттерн не прходил... pos, neg, neu тоже честно говоря хотелось бы оставить (изменения за текущий день)... но да, наверно, вы правы - как-то не совсем регулярно, видимо, получилось... думала, может, как-то можно поколдовать... ещё подумаю... спасибо за совет!
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
S = DecodeUTF8(.response) берем для перекодировки не текст, а чистые данные (ибо не для всех сайтов responseText доступен - иногда там ошибка в нём
Цитата
различия только в этом, остальное регулярно
так вы находите тег TD а потом его содержимое преобразовывайте в текст (и неважно, есть там внутри теги или нет - результат один и тот же будет) функция для преобразования HTML в текст есть здесь: http://excelvba.ru/code/html
Цитата
Function ConvertHTMLtoText(ByVal txt$, Optional RemoveExtraLF As Boolean = False) As String ' Функция преобразует HTML в текст без использования DOM ' Создание функции было обусловлено утечками памяти при использовании библиотеки MSHTML
так я его и регулярила - без внутренних тегов (которых может не быть)... а потом от текста отрезала нужное... в 1-м посте указано, что если раскомментировать корректировка массива в Sub - то, как бы всё раскладывается приемлемо... НО удивляет, неужели альтернативный Submatch никак не выразить в данном случае... как, например, ((шаблон1)|(шаблон2)) ... да и после "отрегуляривания" (sorry за слово) ковыряться в массиве - лишние строки кода, мне подумалось (когда открывала ветку) P.S. про утечки памяти - спасибо - не имела ещё проблем с этим... буду знать! (что бывает и изучать что делать)... осталось разобраться, Когда такое бывает и коснётся ли это меня... учту
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
странно... при всём том, что вы по коду оставили S = Replace(S, Chr(92), "") '\ ... а в паттерне их использовали... я сегодня пол-дня под лупой рассматривала html и свою регулярку, чтобы понять, что сбоило, пока методом, уже не знаю каким, не решила убрать \ - чтобы всё заработало... даже не знаю, что сказать кроме, как sorry... но в принципе да, мы с вами сошлись в одном - лишнее (span) надо убирать - только вы убирали До, а я После "регулярения" (чтобы сохранить пометки о направлении изменений)... спасибо и за ваше видение... наверно, завтра уже на чём-нибудь остановлюсь... а то что-то сегодня уже перегружена этим кодом... всем спасибо! (если по-другому никак)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)