Russian Qt Forum

Qt => Работа с сетью => Тема начата: serg_hd от Февраль 04, 2010, 19:46



Название: Все links загруженной страницы [решено]
Отправлено: serg_hd от Февраль 04, 2010, 19:46
Интересно, есть ли способ получить массив всех ссылок страницы (через qwebview или qwebpage или ещё как-то)?
qwebview.page().mainFrame().toHtml(); не катит, т.к. таким способом нельзя выловить js-ссылки.


Название: Re: Все links загруженной страницы
Отправлено: sendevent от Февраль 04, 2010, 20:28
%qtdir%/examples/webkit/fancybrowser
mainwindow.cpp#145:
Код:
void MainWindow::highlightAllLinks()
{
    QString code = "$('a').each( function () { $(this).css('background-color', 'yellow') } )";
    view->page()->mainFrame()->evaluateJavaScript(code);
}
намек ясен? ;-)


Название: Re: Все links загруженной страницы
Отправлено: serg_hd от Февраль 04, 2010, 20:39
понятно, приступаемс ;)
Когда всё сделаю, отпишусь - полезная штука)


Название: Re: Все links загруженной страницы
Отправлено: serg_hd от Февраль 05, 2010, 14:09
Итак, как оказалось (в ходе экспериментов и изучения доков, за что sendevent отдельно спасибо) qt webkit позволяет кидать результаты работы js-скриптов прямо в ваш какой-либо qt-класс. Моя задача - найти все ссылки на странице, с учётом ссылок, сформированных яваскриптом, что очень важно - была решена след. образом:
Код
Java
 this.webview = new QWebView(Form);
 this.webview.load(new QUrl("http://google.ru"));
 //при окончании загрузки страницы работаем со слотом, извлекающим ссылки
 this.webview.loadFinished.connect(this, "func()");
 this.webview.setVisible(true);
 
public final void func()
{
 //дочерние фреймы страницы, если есть
 List<QWebFrame> framesList = this.webview.page().mainFrame().childFrames();
 //главный фрейм
 framesList.add(this.webview.page().mainFrame());
 /*собственно js-код, извлекающий ссылки, метод возвращает строку с разделителями, которая подвергнется дальнейшей обработке уже со стороны qt-инструментария*/
 String script = "function getAllLinks(){var res;for (i=0;i<document.links.length;i++){res += document.links[i].href + '[LINKS_SEPARATOR]';}return res.substring(0, (res.length - 17));}getAllLinks();";
 //перебор всех фреймов и извлечение из каждого набор ссылок
 Iterator iter = framesList.iterator();
 while(iter.hasNext())
 {
  QWebFrame frame = (QWebFrame) iter.next();
  this.resString += frame.evaluateJavaScript(script);
 }
 
 //вывод в консоль результирующей строки ссылок с разделителями
 System.out.println(this.resString.substring(13, this.resString.length()));
}
 

Примерно такой же сишный код (автор sendevent):
Код
C
QList<QWebFrame *> framesList = getView()->page()->mainFrame()->childFrames();
   framesList.prepend( getView()->page()->mainFrame() );
   QString script = "function getAllLinks(){var res;for (i=0;i<document.links.length;i++){res += document.links[i].href + '[MY_LINKS_SEPARATOR]';}return res;}getAllLinks();";
   QString resString;
   foreach( QWebFrame *pCurrentFrame, framesList )
   {
       resString += pCurrentFrame->evaluateJavaScript( script ).toString();
   }
 
   QStringList resStringList = resString.split( "[MY_LINKS_SEPARATOR]", QString::SkipEmptyParts, Qt::CaseInsensitive );
   qDebug( "finded %d links:", resStringList.size() );
   foreach( QString link, resStringList )
   {
       qDebug( "link: %s", qPrintable( link ) );
   }
 


Таким же образом можно выудить все картинки, тексты и др. информацию сформированную javascript'ом и не только. Полезным при такой проблеме также может стать метод addToJavaScriptWindowObject(), делает обратное: qt->js