2009-06-27 7 views
11

J'essaie d'obtenir des données de page Web dans une chaîne que je pourrais l'analyser. Je n'ai trouvé aucune méthode dans qwebview, qurl et un autre. Pourriez-vous m'aider? Linux, C++, Qt.Comment puis-je obtenir le contenu de la page Web

EDIT:

Merci pour l'aide. Le code fonctionne, mais certaines pages après le téléchargement ont un jeu de caractères cassé. J'ai essayé quelque chose comme ça pour le réparer:

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); 

Tous les résultats = (

Répondre

26

Avez-vous regardé QNetworkAccessManager Voici une rude et échantillon prêt utilisation illustrant:.?

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! 

} 

Dans votre dans votre gestionnaire pour le signal finished, vous recevrez un objet QNetworkReply, dont vous pouvez lire la réponse, car il hérite de QIODevice. Un moyen simple de le faire est juste ca ll readAll pour obtenir un QByteArray. Vous pouvez construire un QString à partir de ce QByteArray et faire ce que vous voulez faire avec.

+0

Merci d'avoir répondu. Mais j'ai une erreur: Object :: connect: Aucun tel slot MainWindow :: replyFinished (QNetworkReply *) – Ockonal

+0

vous devez ajouter un slot à la classe de réception avec la signature void replyFinished (QNetworkReply *) –

+0

Désolé, j'ai compris. Mais je ne sais pas encore lire les données. Aidez-moi, s'il vous plaît :) – Ockonal

1

Avez-vous regardé lynx, curl ou wget? Dans le passé, j'ai dû saisir et analyser des informations à partir d'un site Web, sans accès db, et si vous essayez d'obtenir des données au format dynamique, je crois que ce serait le moyen le plus rapide. Je ne suis pas un type C, mais je suppose qu'il existe un moyen d'exécuter des scripts shell et de récupérer les données, ou au moins de lancer le script et d'extraire la sortie d'un fichier après l'avoir écrit dessus. Dans le pire des cas, vous pouvez lancer un cron et vérifier la présence d'une ligne "terminée" à la fin du fichier écrit avec C, mais je doute que cela soit nécessaire. Je suppose que cela dépend de ce que vous en avez besoin, mais si vous voulez juste le html de sortie d'une page, quelque chose aussi à l'est qu'un wget pipé à awk ou grep peut faire des merveilles.

2

La réponse de Paul Dixon est probablement la meilleure approche, mais la réponse de Jesse touche à quelque chose qui mérite d'être mentionné. CURL - ou plus exactement libcURL est une bibliothèque merveilleusement puissante. Pas besoin d'exécuter des scripts shell et d'extraire des résultats, libCURL est disponible en C, C++ et plus de langues que vous ne pouvez secouer une URL. Cela peut être utile si vous faites une opération bizarre (comme http POST sur ssl?) Que qt ne supporte pas.

+0

Quelqu'un peut-il confirmer que Qt ne peut pas gérer le POST via SSL? – Andrioid

+1

@Andrioid Qt gère POST via SSL sans problèmes. –

+0

Je pense que C-o-r-E signifie que qt ne le fait pas pour vous, vous devrez juste utiliser qt comme un outil pour le faire non comme une solution? –

Questions connexes