首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Qt -获取托管在互联网上的网页的源代码( HTML代码)

Qt -获取托管在互联网上的网页的源代码( HTML代码)
EN

Stack Overflow用户
提问于 2014-07-26 07:34:05
回答 3查看 11.2K关注 0票数 6

我想得到一个网页的源代码,例如StackOverflow的主页。

这是我到目前为止所编写的代码:

代码语言:javascript
复制
QNetworkAccessManager manager;
QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url)));

QString html = response->readAll(); // Source should be stored here

但是什么也没发生!当我尝试获取html字符串的值时,它是空的("")。

那么,该怎么办呢?我使用的是Qt 5.3.1。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-26 07:52:52

你必须在它们之间添加QEventLoop。

代码语言:javascript
复制
QNetworkAccessManager manager;
QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url)));
QEventLoop event;
connect(response,SIGNAL(finished()),&event,SLOT(quit()));
event.exec();
QString html = response->readAll(); // Source should be stored here
票数 5
EN

Stack Overflow用户

发布于 2014-07-26 08:24:58

您需要以异步方式对其进行编码。C++11和Qt出手相救。只需记住,lambda的主体将在稍后的事件循环中执行。

代码语言:javascript
复制
// https://github.com/KubaO/stackoverflown/tree/master/questions/html-get-24965972
#include <QtNetwork>
#include <functional>

void htmlGet(const QUrl &url, const std::function<void(const QString&)> &fun) {
   QScopedPointer<QNetworkAccessManager> manager(new QNetworkAccessManager);
   QNetworkReply *response = manager->get(QNetworkRequest(QUrl(url)));
   QObject::connect(response, &QNetworkReply::finished, [response, fun]{
      response->deleteLater();
      response->manager()->deleteLater();
      if (response->error() != QNetworkReply::NoError) return;
      auto const contentType =
            response->header(QNetworkRequest::ContentTypeHeader).toString();
      static QRegularExpression re("charset=([!-~]+)");
      auto const match = re.match(contentType);
      if (!match.hasMatch() || 0 != match.captured(1).compare("utf-8", Qt::CaseInsensitive)) {
         qWarning() << "Content charsets other than utf-8 are not implemented yet:" << contentType;
         return;
      }
      auto const html = QString::fromUtf8(response->readAll());
      fun(html); // do something with the data
   }) && manager.take();
}

int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
   htmlGet({"http://www.google.com"}, [](const QString &body){ qDebug() << body; qApp->quit(); });
   return app.exec();
}

除非您只使用此代码一次,否则您应该将QNetworkManager实例作为控制器类的成员,或者放在main中,等等。

票数 7
EN

Stack Overflow用户

发布于 2014-07-26 07:52:29

QNetworkAccessManager异步工作。您在get()之后立即调用readAll(),但是在那一刻还没有发出请求。您需要使用documentation中所示的QNetworkAccessManager::finished信号,并将readAll()移至连接到此信号的插槽。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24965972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档