2010-04-03 11 views
2

Je suis en train d'utiliser Qt pour télécharger le code html de l'adresse suivante:Comment puis-je utiliser Qt pour obtenir le code html de la page redirigée?

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

cette URL re-direct à

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

J'essaie de le faire en suivant le chemin, mais je ne peux rien obtenir. cela fonctionne pour une page Web telle que www.google.com, mais pas pour cette page NCBI. est-il possible d'obtenir cette page ??

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"; 
     } 

} 
+0

Veuillez poster votre code pour traiter la redirection. Sans cela, tout ce que vous obtiendrez ici sera une conjecture. –

Répondre

3

Cette page semble avoir une redirection.

De la documentation Qt pour 4.6:

Note: Lorsque le protocole HTTP renvoie une redirigent aucune erreur ne sera signalée. Vous pouvez vérifier s'il existe une redirection avec l'attribut QNetworkRequest :: RedirectionTargetAttribute .

+0

Merci:) ~ C'est vraiment utile. Cependant, j'ai essayé d'utiliser la redirection, cela fonctionne - je peux obtenir du code html qui appartient à NCBI, mais ce code n'est pas le même que ce que nous pouvons voir à travers le navigateur. Avez-vous une idée de pourquoi? –

+0

Il est possible qu'il existe des scripts côté serveur qui servent un contenu différent en fonction du navigateur qu'il voit. Essayez de définir la chaîne de l'agent utilisateur pour imiter firefox ou quelque chose. Essayez ceci: 'response-> 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) ");' ou quelque chose de similaire. –

+0

Le setHeader est une fonction protégée dans QNetworkReply donc il ne peut pas être appelé directement, mais votre réponse me fait savoir la raison et me donne une direction, merci :) (Je devrais voter mais je n'ai pas assez de réputation XD) Je vais d'abord essayer de configurer le navigateur pour voir si cela fonctionne. il y a une chose, cela n'affectera que le code html, non? Je veux dire, nous n'avons pas besoin d'avoir Firefox et Windows sur notre système? J'ai besoin de la propriété multi-plateforme. –