Как я могу получить контент веб-страницы - PullRequest
11 голосов
/ 27 июня 2009

Я пытаюсь получить данные веб-страницы в виде строки, чтобы я мог их разобрать. Я не нашел никаких методов в qwebview, qurl и других. Не могли бы вы помочь мне? Linux, C ++, Qt.

EDIT:

Спасибо за помощь. Код работает, но некоторые страницы после загрузки сломали кодировку. Я пытался что-то вроде этого, чтобы исправить это:

QNetworkRequest *request = new QNetworkRequest(QUrl("http://ru.wiktionary.org/wiki/bovo"));

request->setRawHeader( "User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); "
                       "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1" );
request->setRawHeader( "Accept-Charset", "win1251,utf-8;q=0.7,*;q=0.7" );
request->setRawHeader( "charset", "utf-8" );
request->setRawHeader( "Connection", "keep-alive" );

manager->get(*request);

Любые результаты = (.

Ответы [ 3 ]

25 голосов
/ 27 июня 2009

Вы смотрели на QNetworkAccessManager ? Вот примерный пример, иллюстрирующий использование:

class MyClass : public QObject
{
Q_OBJECT

public:
    MyClass();
    void fetch(); 

public slots:
    void replyFinished(QNetworkReply*);

private:
    QNetworkAccessManager* m_manager;
};


MyClass::MyClass()
{
    m_manager = new QNetworkAccessManager(this);

    connect(m_manager, SIGNAL(finished(QNetworkReply*)),
         this, SLOT(replyFinished(QNetworkReply*)));

}

void MyClass::fetch()
{
    m_manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
}

void MyClass::replyFinished(QNetworkReply* pReply)
{

    QByteArray data=pReply->readAll();
    QString str(data);

    //process str any way you like!

}

В вашем обработчике для сигнала закончено вам будет передан объект QNetworkReply , от которого вы можете прочитать ответ, поскольку он наследуется от QIODevice, Простой способ сделать это - просто вызвать readAll , чтобы получить QByteArray . Вы можете создать QString из этого QByteArray и делать с ним все, что хотите.

2 голосов
/ 28 июня 2009

Ответ Пола Диксона, вероятно, является лучшим подходом, но ответ Джесси трогает кое-что, о чем стоит упомянуть.

cURL - или, точнее, libcURL - это удивительно мощная библиотека. Нет необходимости в выполнении сценариев оболочки и разборе выходных данных, libCURL доступен на C, C ++ и более языках, чем вы можете потрясти URL. Это может быть полезно, если вы делаете какую-то странную операцию (например, HTTP POST поверх ssl?), Которую не поддерживает qt.

1 голос
/ 27 июня 2009

Вы смотрели на рысь, локон или wget? В прошлом мне нужно было получать и анализировать информацию с веб-сайта, без доступа к базе данных, и если вы пытаетесь получить динамически форматированные данные, я считаю, что это будет самый быстрый способ. Я не парень C, но я предполагаю, что есть способ запустить сценарии оболочки и получить данные или, по крайней мере, запустить сценарий и получить вывод из файла после записи в него. В худшем случае вы можете запустить cron и проверить «готовую» строку в конце записанного файла на C, но я сомневаюсь, что это будет необходимо. Я полагаю, это зависит от того, для чего он вам нужен, но если вы просто хотите получить HTML-код страницы, то что-то восточное, например, wget, переданный в awk или grep, может творить чудеса.

...