Как я могу получить содержимое веб-страницы
Я пытаюсь получить данные веб-страницы в строке, чем я мог ее разобрать. Я не нашел методов в qwebview, qurl и другом. Не могли бы вы помочь мне? Linux, С++, 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);
Любые результаты = (.
Ответы
Ответ 1
Вы посмотрели 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!
}
В вашем обработчике сигнала finished вам будет передан QNetworkReply, на который вы можете прочитать ответ, поскольку он наследует от QIODevice. Простой способ сделать это - просто вызвать readAll, чтобы получить QByteArray. Вы можете построить QString из этого QByteArray и делать все, что вы хотите с ним сделать.
Ответ 2
Пол Диксон ответ, вероятно, лучший подход, но ответ Джесси отвечает на что-то заслуживающее упоминания.
cURL - или, точнее, libcURL - замечательно мощная библиотека. Нет необходимости в выполнении сценариев оболочки и синтаксического анализа, libCURL доступен на C, С++ и более языках, чем вы можете пожать URL. Может быть полезно, если вы делаете какую-то странную операцию (например, http POST over ssl?), Которую qt не поддерживает.
Ответ 3
Вы изучали рысь, завиток или wget?
Раньше мне приходилось захватывать и анализировать информацию с веб-сайта, без доступа к db, и если вы пытаетесь получить данные с динамической форматировкой, я считаю, что это было бы самым быстрым способом. Я не парень C, но я предполагаю, что есть способ запуска сценариев оболочки и захвата данных, или, по крайней мере, запуск script и захват вывода из файла после его записи. В худшем случае вы можете запустить cron и проверить "законченную" строку в конце написанного файла на C, но я сомневаюсь, что это будет необходимо. Я полагаю, что это зависит от того, для чего вам это нужно, но если вы просто хотите выводить html страницы, то на восток, как wget, подключенный к awk или grep, могут творить чудеса.