2009-06-27 3 views
11

sto cercando di ottenere dati della pagina web in stringa che potrei analizzare. Non ho trovato alcun metodo in qwebview, qurl e un altro. Potresti aiutarmi? Linux, C++, Qt.Come posso ottenere il contenuto della pagina web

EDIT:

Grazie per l'aiuto. Il codice funziona, ma alcune pagine dopo il download hanno rotto il set di caratteri. Ho provato qualcosa di simile per ripararlo:

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

Tutti i risultati = (

risposta

26

Hai guardato QNetworkAccessManager Ecco un rudimentale esempio l'uso che illustra:.?

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! 

} 

Nella tua nel gestore per il segnale finished verrà passato un oggetto QNetworkReply, che è possibile leggere la risposta da come eredita da QIODevice. Un modo semplice per farlo è solo ca ll readAll per ottenere un QByteArray. Puoi costruire un QString da quel QByteArray e fare tutto ciò che vuoi fare con esso.

+0

Grazie per la risposta. Ma ho un errore: Oggetto :: connetti: nessuno di questi slot MainWindow :: replyFinished (QNetworkReply *) – Ockonal

+0

è necessario aggiungere uno slot alla classe di ricezione con la firma void replyFinished (QNetworkReply *) –

+0

Spiacente, ho capito. Ma non so ancora come leggere i dati. Aiutatemi, per favore :) – Ockonal

1

Hai esaminato la lince, il ricciolo o il wget? In passato ho avuto bisogno di catturare e analizzare informazioni da un sito Web, senza accesso db, e se si sta cercando di ottenere dati formattati dinamicamente, credo che questo sarebbe il modo più veloce. Non sono un tipo C, ma presumo che esista un modo per eseguire script di shell e acquisire i dati, o almeno eseguire lo script e catturare l'output da un file dopo averlo scritto. Nella peggiore delle ipotesi, è possibile eseguire un cron e verificare la presenza di una riga "completata" alla fine del file scritto con C, ma dubito che sarà necessario. Suppongo che dipenda da ciò che ti serve, ma se vuoi solo l'output html di una pagina, qualcosa come est come un wget convogliato su awk o grep può fare miracoli.

2

La risposta di Paul Dixon è probabilmente l'approccio migliore, ma la risposta di Jesse tocca qualcosa che vale la pena menzionare.

cURL - o più precisamente libcURL è una libreria straordinariamente potente. Non c'è bisogno di eseguire script di shell e output di analisi, libCURL è disponibile in C, C++ e più lingue di quelle a cui è possibile scuotere un URL. Potrebbe essere utile se stai facendo qualche operazione strana (come http POST su ssl?) Che qt non supporta.

+0

Qualcuno può confermare che Qt non può gestire il POST tramite SSL? – Andrioid

+1

@Andrioid Qt gestisce POST tramite SSL senza problemi. –

+0

Penso che C-o-r-E significhi che qt non lo fa per te, dovrai solo usare qt come strumento per farlo non come soluzione? –