Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг html страницы 
:(
    Опции темы
Kurtjke
Дата 3.10.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.9.2011

Репутация: нет
Всего: нет



Подскажите пожалуйста,как с помощью boost/regex вытащить из странички курс валют.Знаю что это не сложно,но сам уже целый день разобраться не могуsmile .
Код

html"title="Динамика курса EUR грн.">EUR грн.</a></th><td><strong>10,65
</strong></td><td><strong>10,87</strong></td></tr><tr><th><a href
"title="Динамика курса RUB грн.">RUB грн.</a></th><td><strong>2,39</strong></td>
<td><strong>2,54</strong></td></tr></table>


пробовал вытащить через regex_match
пробовал использовать правило (EUR*)\\w+(\\d+?).+(\\d+?)



Это сообщение отредактировал(а) Kurtjke - 4.10.2011, 00:48
PM MAIL   Вверх
bsa
Дата 3.10.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Kurtjke, ты кусок кода страницы представь тут. А то не хотелось бы гадать на кофейной гуще, для какого сайта тебе нужен regexp.
PM   Вверх
fish9370
Дата 4.10.2011, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



вот так попробуй:
EUR.*?(\\d+,\\d+).*?(\\d+,\\d+)
RUB.*?(\\d+,\\d+).*?(\\d+,\\d+)

Это сообщение отредактировал(а) fish9370 - 4.10.2011, 09:28


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 4.10.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Тут напрашивается 2х ходовка - сначала удалить все тэги <...> (заменить на пробелы), потом из того, что осталось искать твои EUR. А то завтра на страничке добавят еще какой нибудь <b> </b> вокруг 10,65 и весь твой regex пойдет лесом  smile 

PM MAIL   Вверх
fish9370
Дата 5.10.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(xvr @  4.10.2011,  12:08 Найти цитируемый пост)
А то завтра на страничке добавят еще какой нибудь <b> </b> вокруг 10,65 и весь твой regex пойдет лесом


ну зачем же так пугать?

.*?

- как раз и обеспечивает независимость от любых вставок (ну за исключением цифр)..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 5.10.2011, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(fish9370 @  5.10.2011,  18:04 Найти цитируемый пост)
как раз и обеспечивает независимость от любых вставок (ну за исключением цифр).. 

Угу, а цифры в тегах тоже вполне могут появиться

PM MAIL   Вверх
fish9370
Дата 5.10.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



это повлияет только если там появится шаблон "(\\d+,\\d+)", а это крайне мало вероятно.. вобщем, не вижу смысла парсить http без достаточных на то оснований.. регулярные выражения мощнейший инструмент.. и здесь это втему..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Kurtjke
Дата 5.10.2011, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.9.2011

Репутация: нет
Всего: нет



Спасибо за ответы!Разбирает  нормально,но при попытке записать результаты в файл вылетает ошибка

 error C2664: 'WriteFile' : cannot convert parameter 2 from 'boost::match_results<BidiIterator>' to 'LPCVOID'

Это как то преобразовать тип данных надо?

PM MAIL   Вверх
xvr
Дата 6.10.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(fish9370 @  5.10.2011,  22:28 Найти цитируемый пост)
вобщем, не вижу смысла парсить http без достаточных на то оснований.. 

А я и не предлагаю парсить. Я предлагаю теми же regex'пами выкусить все <[^>]*> (т.е. сделать их замену на пустую строку), а уж потом искать что надо. Насколько я помню boost::regex это умеет.
Точно умеет - regex_replace

Цитата(Kurtjke @  5.10.2011,  23:57 Найти цитируемый пост)
error C2664: 'WriteFile' : cannot convert parameter 2 from 'boost::match_results<BidiIterator>' to 'LPCVOID'
Это как то преобразовать тип данных надо?
match_results - это набор строк (количеством size() ). Их надо все перебратьи результаты записать. Данные из результатов извлекать методами str(index) и length(index)




Это сообщение отредактировал(а) xvr - 6.10.2011, 09:55
PM MAIL   Вверх
Kurtjke
Дата 6.10.2011, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.9.2011

Репутация: нет
Всего: нет



О,спасибо)!
PM MAIL   Вверх
Kurtjke
Дата 6.10.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.9.2011

Репутация: нет
Всего: нет



что я делаю не так?
Код

 if( boost::regex_match(strt, m, reg))
   {
    int sz=m.size();
    for (int i=0;i<sz;++i)
    {
    std::string line = (std::string)m[i];
    const char *buf = line.c_str();
    WriteFile(hFile,buf,sizeof(buf)-1,&dwBytesRead,0);
}}

выходной файл остается пустым(

Это сообщение отредактировал(а) Kurtjke - 6.10.2011, 22:46
PM MAIL   Вверх
xvr
Дата 7.10.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Kurtjke @  6.10.2011,  22:45 Найти цитируемый пост)
  WriteFile(hFile,buf,sizeof(buf)-1,&dwBytesRead,0);

Это (sizeof(buf)) явно неправильно. Попробуйте так:
Код

    for (int i=0;i<sz;++i)
    {
     WriteFile(hFile,m.str(i),m.length(i),&dwBytesRead,0);
    }

PM MAIL   Вверх
Kurtjke
Дата 7.10.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.9.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 7.10.2011,  12:35)

Это (sizeof(buf)) явно неправильно. Попробуйте так:
Код

    for (int i=0;i<sz;++i)
    {
     WriteFile(hFile,m.str(i),m.length(i),&dwBytesRead,0);
    }

выдает вот такую ошибку:
Код

error C2664: 'WriteFile' : cannot convert parameter 2 from 'std::basic_string<_Elem,_Traits,_Ax>' to 'LPCVOID'

И происходит что то непонятное:я скачиваю страницу,сохраняю,она нормально открывается.
После того как я пытаюсь ее парсить ,а потом привожу код к начальному виду ,страница сохраняется , но уже с другой кодировкой:
Код

§аЏ§аНа§ДаЕ§аКб§§§§§do§cum§ent§.do§cum§ent§Ele§men§t.i§d =§ "j§s";§ if§ (d§ocu§men§t.c§omp§atM§ode§ !=§ "C§SS1§Com§pat§") 

думаю в из за этого ничего и не получается.

Это сообщение отредактировал(а) Kurtjke - 7.10.2011, 23:12
PM MAIL   Вверх
xvr
Дата 8.10.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Kurtjke @  7.10.2011,  22:53 Найти цитируемый пост)
выдает вот такую ошибку:

Сделайте так
Код

WriteFile(hFile,m.str(i).c_str(),m.length(i),&dwBytesRead,0);

Цитата(Kurtjke @  7.10.2011,  22:53 Найти цитируемый пост)
страница сохраняется ,

Пардон, кем она сохраняется? Про модификацию исходного HTML пока речи не было

PM MAIL   Вверх
semibug
Дата 10.10.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Как экзотический вариант можно применить к HTML странице XSLT преобразование, тогда в случае чего можно поправить только XSL файл, без пересборки программы.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.