【问题标题】:How can I use Qt to get html code of the redirected page?如何使用 Qt 获取重定向页面的 html 代码?
【发布时间】:2010-04-03 23:08:23
【问题描述】:

我正在尝试使用 Qt 从以下 url 下载 html 代码:

http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=nucleotide&cmd=search&term=AB100362

这个网址会重定向到

www.ncbi.nlm.nih.gov/nuccore/27884304

我尝试通过以下方式做到这一点,但我什么也得不到。 它适用于某些网页,例如 www.google.com,但不适用于此 NCBI 页面。有什么办法可以得到这个页面??

QNetworkReply::NetworkError downloadURL(const QUrl &url, QByteArray &data)
{
    QNetworkAccessManager manager;
    QNetworkRequest request(url);
    QNetworkReply *reply = manager.get(request);

    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

    if (reply->error() != QNetworkReply::NoError)
    {
        return reply->error();
    }
    data = reply->readAll();
    delete reply;
    return QNetworkReply::NoError;
}

void GetGi()
{
        int pos;

        QString sGetFromURL = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi";
        QUrl url(sGetFromURL);
        url.addQueryItem("db", "nucleotide");
        url.addQueryItem("cmd", "search");
        url.addQueryItem("term", "AB100362");

        QByteArray InfoNCBI;
        int errorCode = downloadURL(url, InfoNCBI);
        if (errorCode != 0 )
        {
            QMessageBox::about(0,tr("Internet Error "), tr("Internet Error %1: Failed to connect to NCBI.\t\nPlease check your internect connection.").arg(errorCode));
            return "ERROR";
        }

}

【问题讨论】:

  • 请发布您处理重定向的代码。没有它,你在这里得到的任何东西都将是猜测。

标签: c++ qt qt4 qnetworkaccessmanager


【解决方案1】:

该页面似乎有重定向。

来自 4.6 的 Qt 文档:

注意:当 HTTP 协议返回一个 重定向不会报错。 您可以检查是否有重定向 与 QNetworkRequest::RedirectionTargetAttribute 属性。

【讨论】:

  • 谢谢 :)~ 真的很有帮助。但是,我尝试使用重定向,它有效——我可以得到一些属于 NCBI 的 html 代码,但这些代码与我们通过浏览器看到的不同。你知道为什么吗??
  • 可能有一些服务器端脚本正在运行,根据它看到的浏览器提供不同的内容。尝试将用户代理字符串设置为模仿 firefox 或其他东西。试试这个:reply->setHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"); 或类似的东西。
  • setHeader 是 QNetworkReply 中的受保护函数,因此无法直接调用,但您的回答让我知道原因并给我一些指导,谢谢 :) (我应该投票但我不有足够的声誉XD)我会先尝试设置浏览器,看看它是否有效。有一件事,这只会影响我们得到的html代码,对吧?我的意思是,我们不需要在我们的系统上安装 firefox 和 windows?我需要跨平台属性。
  • 是的,所以您可以从QNetworkReply 类继承并在其构造函数中调用setHeader。您不需要安装 firefox 或类似的东西,它只会影响它声称的浏览器:-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 2010-11-24
相关资源
最近更新 更多