Страницы: 1
RSS
Отрегулярить Кривые Доходностей с сайта, запрос на Financial Times
 
макрос во вложенном файле...
что сделано:
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 или есть более совершенный метод побороть странности перекодировки??  :oops:
может быть, чей-нибудь свежий взгляд добавит ювелирности изделию  :) ... по коду знаками ??????? отмечены места, которые не нравятся (их всего 3)... Заранее спасибо  
Изменено: JeyCi - 23.08.2016 18:39:54
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
и правильно ли я подошла к <> через Replace
думаю, без этого можно обойтись (при правильной функции перекодировки)
сколько парсил - никаких проблем не было
я конвертировал в 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 кода (как будет без тегов. и как с тегами)
Игорь спасибо за свежие идеи... хотя у меня почему-то вылезли китайские иероглифы  8-0  от такого кода (под спойлером)

.responseBody

а S = DecodeUTF8(.responseText) - проблемы <> (chr(60)) и (chr(62)) - остаются...
***
два куска там по коду - один как есть, 2-й закоментирован (когда есть число - оно обрамляется тегами... видно в районе окончания работающего RE строкой ниже в закоментированном... (от хвоста читать удобнее, чтобы увидеть новые теги, хотя они во вложенном файле и в ячейках лежат)... как-то так, а (.+?) - это направление изменения (pos+, neg-, neu нет изменений за день) И цифра, на сколько изменилось
Тэги:
<td><spanclass=\mod-format--neg\>>-0.01</span></td>
или просто
<td>--</td> (если --)
... различия только в этом, остальное регулярно
Изменено: JeyCi - 23.08.2016 19:21:17
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, добрый вечер. Для регулярок проще будет, когда переменная с текстом для обработки постоянна, за исключением данных, которые вытаскиваем регулярками.
В таком случае можно не побояться дополнительных replace. :)
У меня по сути получилось проще, набросал на скорую руку:
Код
    S = Replace(S, "pos", "")
    S = Replace(S, "neg", "")
    S = Replace(S, "neu", "")
    S = Replace(S, "</span>", "")
    S = Replace(S, "<spanclass=mod-format-->", "")
Ну и кормим таким паттерном:
Код
"<tr><tdclass=\mod-ui-table__cell--text\><spanclass=\mod-ui-hide-xsmall\>(.+?)<spanclass=\mod-ui-hide-small-above\>(.+?)</td><td>(.+?)</td><td>(.+?)</td><td>(.+?)</td><td>(.+?)</td></tr>"
Изменено: Jungl - 23.08.2016 21:31:41
 
Цитата
Jungl написал:  и кормим таким паттерном
что-то не хочет кушать... я кстати \ (chr92) убирала, потому что с ними мой паттерн не прходил... pos, neg, neu тоже честно говоря хотелось бы оставить (изменения за текущий день)... но да, наверно, вы правы - как-то не совсем регулярно, видимо, получилось... думала, может, как-то можно поколдовать... ещё подумаю... спасибо за совет!
Изменено: JeyCi - 23.08.2016 23:16:46
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
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
 
Цитата
JeyCi написал:
что-то не хочет кушать...
Точно? Проверьте:
 
Цитата
Игорь написал: так вы находите тег TD
так я его и регулярила  :) - без внутренних тегов (которых может не быть)... а потом от текста отрезала нужное... в 1-м посте указано, что если раскомментировать корректировка массива в Sub - то, как бы всё раскладывается приемлемо... НО удивляет, неужели альтернативный Submatch никак не выразить в данном случае... как, например, ((шаблон1)|(шаблон2)) ... да и  после "отрегуляривания" (sorry за слово) ковыряться в массиве - лишние строки кода, мне подумалось (когда открывала ветку)
P.S. про утечки памяти - спасибо - не имела ещё проблем с этим... буду знать! (что бывает и изучать что делать)... осталось разобраться, Когда такое бывает и коснётся ли это меня...  8) учту
Изменено: JeyCi - 23.08.2016 23:20:52
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Игорь написал: S = DecodeUTF8(.response)
не хочет... а я вот думаю, может, эта функция DecodeUTF8 для x64 офиса или windows?... а у меня x32
Изменено: JeyCi - 23.08.2016 22:20:34
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Jungl написал: Точно? Проверьте:
странно... при всём том, что вы по коду оставили S = Replace(S, Chr(92), "") '\ ... а в паттерне их использовали... я сегодня пол-дня под лупой рассматривала html и свою регулярку, чтобы понять, что сбоило, пока методом, уже не знаю каким, не решила убрать \ - чтобы всё заработало... даже не знаю, что сказать  :oops: кроме, как sorry... но в принципе да, мы с вами сошлись в одном - лишнее (span) надо убирать  :) - только вы убирали До, а я После "регулярения" (чтобы сохранить пометки о направлении изменений)... спасибо и за ваше видение... наверно, завтра уже на чём-нибудь остановлюсь... а то что-то сегодня уже перегружена этим кодом... всем спасибо! (если по-другому никак)  
Изменено: JeyCi - 23.08.2016 22:40:00
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Так пойдет?
И DecodeUTF8  не понадобится.
Изменено: Doober - 23.08.2016 22:42:51
 
Цитата
Doober написал: Так пойдет?
да уж  :)
Цитата
JeyCi написал: свежий взгляд добавит ювелирности изделию
не знала, чего ожидать, когда открывала ветку... для того, чтобы долго изучала, точно пойдёт  8)... пока слепая, но очень интересно... спасибо!  
Изменено: JeyCi - 23.08.2016 23:47:09
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему
Наверх