Russian Qt Forum
Октябрь 17, 2024, 08:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QRegExp не пойму как...  (Прочитано 5144 раз)
Hellrider
Гость
« : Апрель 04, 2013, 16:38 »

Хочу вытащить из html страницы все что между тегами <a> делаю по примерам но что то не клеится, запутался вообще. Подскажите как реализовать правильно
Код:
void Notice::slotUpdate(QNetworkReply* reply){
    QByteArray array;
    array = reply->readAll();
    QString str_temp;
    str_temp = array;
    int pos = 0;

    QRegExp reg("<a>(.)</a>");
    reg.setMinimal(true);
    QStringList strl;
    while(pos = reg.indexIn(str_temp, pos) != -1){
        strl << reg.cap(1);
        pos += reg.matchedLength();
    }
    for(int i = 0; i < strl.size(); i++){
    qDebug() << strl.at(i);
    }
}
Записан
_OLEGator_
Гость
« Ответ #1 : Апрель 04, 2013, 16:51 »

Вот так правильно: (.)(.)  Смеющийся
Конкретно, что не клеится то?

UPD
Пишут, что "/" - спецсимвол, посему, так будет правильно:
"<a>(.+)<\\/a>"
« Последнее редактирование: Апрель 04, 2013, 16:57 от _OLEGator_ » Записан
Hellrider
Гость
« Ответ #2 : Апрель 04, 2013, 16:54 »

qDebug ничего не выводит
Записан
Hellrider
Гость
« Ответ #3 : Апрель 04, 2013, 17:00 »

Вот так правильно: (.)(.)  Смеющийся
Конкретно, что не клеится то?

UPD
Пишут, что "/" - спецсимвол, посему, так будет правильно:
"<a>(.+)<\\/a>"

Пробовал "<a>(.+)<\\/a>" и так "<a>(.+)<///a>" не работает.

А вообще спецсимвол это обратная косая черта \
« Последнее редактирование: Апрель 04, 2013, 17:05 от Hellrider » Записан
_OLEGator_
Гость
« Ответ #4 : Апрель 04, 2013, 17:06 »

У меня такое выражение работает (Qt 4.8.2):
<a>(.+)</a>
и такое тоже:
<a>(.+)<\\/a>

Не только обратная косая черта, точка, *, + и т.д.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Апрель 04, 2013, 17:11 »

операцию присваивания в while возьми в скобки. Всё работает:

Код
C++ (Qt)
   QByteArray array = "Web page <a>hallo</a> ... <a>hallo2</a>";
   QString str_temp;
   str_temp = array;
   int pos = 0;
 
   QRegExp reg("<a>(.*)</a>");
   reg.setMinimal(true);
   QStringList strl;
   while((pos = reg.indexIn(str_temp, pos)) != -1){
       strl << reg.cap(1);
       pos += reg.matchedLength();
   }
   for(int i = 0; i < strl.size(); i++){
   qDebug() << strl.at(i);
 
   // почему не
   // qDebug() << strl;
   }
 

Выводит

Цитировать
hallo
hallo2
« Последнее редактирование: Апрель 04, 2013, 17:14 от Alex Custov » Записан
Hellrider
Гость
« Ответ #6 : Апрель 04, 2013, 17:24 »

операцию присваивания в while возьми в скобки. Всё работает:

Код
C++ (Qt)
   QByteArray array = "Web page <a>hallo</a> ... <a>hallo2</a>";
   QString str_temp;
   str_temp = array;
   int pos = 0;
 
   QRegExp reg("<a>(.*)</a>");
   reg.setMinimal(true);
   QStringList strl;
   while((pos = reg.indexIn(str_temp, pos)) != -1){
       strl << reg.cap(1);
       pos += reg.matchedLength();
   }
   for(int i = 0; i < strl.size(); i++){
   qDebug() << strl.at(i);
 
   // почему не
   // qDebug() << strl;
   }
 

Выводит

Цитировать
hallo
hallo2

Заключил в кавычки, после цикла дебаг выводит размер QStringList 0, а может быть проблемма из-за кирилицы которая между тегами?

Сделал обычную строку strl = "<a> bla bla bla</a> все заработало. Но почему html страницу не хочет обрабатывать?
« Последнее редактирование: Апрель 04, 2013, 17:29 от Hellrider » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Апрель 04, 2013, 17:30 »

Код получше.

Код
C++ (Qt)
   QString data = "Web page <a>hallo</a> ... <a>hallo2</a>";
   int pos = 0;
 
   QRegExp reg("<a>(.*)</a>");
   reg.setMinimal(true);
   QStringList strl;
 
   while((pos = reg.indexIn(data, pos)) != -1){
       strl << reg.cap(1);
       pos += reg.matchedLength();
   }
 
   qDebug() << strl;
 

Ты проверял, что данные, которые ты парсишь, содержат именно ТАКИЕ ссылки? Приведи пример из html документа. Кириллица может и влияет.

Up. забыл setMinimal().
« Последнее редактирование: Апрель 04, 2013, 17:35 от Alex Custov » Записан
Hellrider
Гость
« Ответ #8 : Апрель 04, 2013, 17:36 »

<a href="http:://google.com" id="123">текст</a>

дауж меня заклинило блин  Смеющийся а тег то содержит параметры...

а за что отвечает setMinimal()? читал в доке, но не понял
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Апрель 04, 2013, 17:38 »

в QtWebkit есть парсер документа, можешь его использовать.
Записан
Hellrider
Гость
« Ответ #10 : Апрель 04, 2013, 17:48 »

в QtWebkit есть парсер документа, можешь его использовать.

Перелопатил кучу всего, пишут если в html есть ошибки парсер не взлетает. Пробовал libxml2 там парсер для html есть, но там темный лес для меня. Еще нашел тут http://blog.sjinks.pro/c-cpp/qt/942-html-parser-qt/ сделал по инструкции все компилит, записываю DOM в файла, а там никакого DOM дерева нету, записывается html страница какая и была.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.179 секунд. Запросов: 23.