Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hellrider от Апрель 04, 2013, 16:38



Название: QRegExp не пойму как...
Отправлено: 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);
    }
}


Название: Re: QRegExp не пойму как...
Отправлено: _OLEGator_ от Апрель 04, 2013, 16:51
Вот так правильно: (.)(.)  ;D
Конкретно, что не клеится то?

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


Название: Re: QRegExp не пойму как...
Отправлено: Hellrider от Апрель 04, 2013, 16:54
qDebug ничего не выводит


Название: Re: QRegExp не пойму как...
Отправлено: Hellrider от Апрель 04, 2013, 17:00
Вот так правильно: (.)(.)  ;D
Конкретно, что не клеится то?

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

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

А вообще спецсимвол это обратная косая черта \


Название: Re: QRegExp не пойму как...
Отправлено: _OLEGator_ от Апрель 04, 2013, 17:06
У меня такое выражение работает (Qt 4.8.2):
<a>(.+)</a>
и такое тоже:
<a>(.+)<\\/a>

Не только обратная косая черта, точка, *, + и т.д.


Название: Re: QRegExp не пойму как...
Отправлено: Alex Custov от Апрель 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


Название: Re: QRegExp не пойму как...
Отправлено: Hellrider от Апрель 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 страницу не хочет обрабатывать?


Название: Re: QRegExp не пойму как...
Отправлено: Alex Custov от Апрель 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().


Название: Re: QRegExp не пойму как...
Отправлено: Hellrider от Апрель 04, 2013, 17:36
<a href="http:://google.com" id="123">текст</a>

дауж меня заклинило блин  ;D а тег то содержит параметры...

а за что отвечает setMinimal()? читал в доке, но не понял


Название: Re: QRegExp не пойму как...
Отправлено: Alex Custov от Апрель 04, 2013, 17:38
в QtWebkit есть парсер документа, можешь его использовать.


Название: Re: QRegExp не пойму как...
Отправлено: Hellrider от Апрель 04, 2013, 17:48
в QtWebkit есть парсер документа, можешь его использовать.

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