вторник, 22 мая 2012 г.

QtWebKit получение HTML кода страницы с помощью QWebPage

Задача мелкая и простая. Получим HTML код какой-нибудь страницы.



Первым делом добавим поддержку QtWebKit в проект. Для этого в файле проекта (расширение .pro) в любом месте добавляем строчку:


QT      += webkit

Что мы будем делать далее в общем чертах?
Мы создаём свой класс от класса QObject, туда добавляем класс QWebPage, и связываем некоторые его сигналы с нашим классом, дабы мы могли проследить за процессом загрузки, а по окончанию загрузки извлечь необходимый нам HTML код. Вывод HTML кода я сделал через QDebug дабы не нагружать исходник.

Объявление класса:
#ifndef WEBPAGEPARSER_H
#define WEBPAGEPARSER_H

#include <QObject>
#include <QtWebKit/QWebPage>
#include <QtWebKit/QWebFrame>
#include <QDebug>

class WebPageParser : public QObject
{
    Q_OBJECT
public:
    WebPageParser(const QUrl &url); // конструктор, получающий в качестве единственного аргумента ссылку на страницу.

private slots:
    void readHTML(); // Функция, извлекающая html код страницы по окончании загрузки
    void loadProgress(int progress);  // Функция, получающая текущее состояние загрузки (от 0 до 100)

private:
    QWebPage page; // Наша страница %)    
};

#endif // WEBPAGEPARSER_H


Теперь опишу каждый метод по отдельности.

1) Конструктор WebPageParser(const QUrl &url):

WebPageParser::WebPageParser(const QUrl &url)
{
    page.mainFrame()->load(url); // url - адрес страницы, после вызова этого метода начинается загрузка страницы
    connect(&page, SIGNAL(loadFinished(bool)), this, SLOT(readHTML())); // сигнал loadFinished вызывается по окончании загрузки интернет страницы
    connect(&page, SIGNAL(loadProgress(int)), this, SLOT(loadProgress(int))); // сигнал loadProgress вызывается при каждом изменении состоянии загрузки
}


2) Слот void loadProgress(int progress):

void WebPageParser::loadProgress(int progress)
{
    qDebug() << "progress = " << progress; // выводим текущее состояние загрузки в qDebug()
}


3) слот void readHTML() :

void WebPageParser::readHTML()
{
    qDebug() << page.mainFrame()->toHtml(); // выводим html код страницы
}


После запуска приложения в консоли (или в отладке) вы увидите HTML код нужной вам страницы.

7 комментариев:

  1. у меня по данному примеру не отображаются русские символы (вместо них - кракозябры). Проект в UTF-8. Если сама страничка тоже в UTF-8 (сохраняю на компе, меняю кодировку), то все работает нормально. Как с этим бороться???

    ОтветитьУдалить
  2. http://easy-qt.blogspot.ru/2012/11/qt.html Там всё подробно описано :)

    ОтветитьУдалить
  3. но ведь сама интнрнет-страница в другой кодировке!!!...при попытке ее чтения из инета и получаются кракозябры=((

    ОтветитьУдалить
  4. Вообще из интернета так же приходят в UTF-8. В index.html должна быть указана кодировка. Я проверял :)

    ОтветитьУдалить
  5. у меня проблема связи с этим кодом... когда я использую ее в main() то все ок... но когда использую в другом классе, например в функции то оно не работает... скорее всего не работает только этот фрагмент
    page.mainFrame()->load(url);
    помогите пожалуйста.

    ОтветитьУдалить
    Ответы
    1. Не в то время ты писал :)
      А как оно "не работает"? Ошибку выдает или что?

      Удалить