2009-06-27 21 views
11

私はそれを解析することができる文字列でWebページデータを取得しようとしています。私はqwebview、qurlと別の方法では何も見つからなかった。私たちを手伝ってくれますか? Linux、C++、Qt。ウェブページのコンテンツを取得するには

EDIT:助けを

感謝。コードは機能していますが、ダウンロード後の一部のページで文字セットが壊れています。 私はそれを修復するために、このような何かを試してみました:

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

どれ結果=(

答えて

26

あなたがここでの使用を示すラフと準備ができて、サンプルのQNetworkAccessManager見てきました:あなたは

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! 

} 

finishedシグナルのハンドラでは、QNetworkReplyオブジェクトが渡されます。このオブジェクトは、QIODeviceから継承した応答を読み取ることができます。これを行う簡単な方法は、 QByteArrayを取得するには、readAllを入力してください。あなたはそのQByteArrayからQStringを構築し、それを使ってやりたいことを何でもします。

+0

お返事ありがとうございます。しかし、私はエラーが発生しました: オブジェクト::接続:いいえそのようなスロットMainWindow :: replyFinished(QNetworkReply *) – Ockonal

+0

あなたは署名を持つ受信クラスにスロットを追加する必要がありますreplyFinished(QNetworkReply *) –

+0

申し訳ありませんが、私は理解しています。しかし、私はまだデータを読む方法を知らない。私を助けてください:) – Ockonal

1

lynx、curl、またはwgetを調べましたか? これまでは、ウェブサイトから情報を取得して解析する必要がありました。動的にフォーマットされたデータを取得しようとすると、これが最も簡単な方法になると思います。私はCの男ではありませんが、シェルスクリプトを実行してデータを取得する方法や、少なくともスクリプトを実行して、ファイルに書き込んだ後にファイルから出力を取得する方法があると仮定します。最悪のシナリオでは、cronを実行して、Cで書かれたファイルの最後に「終了」行があるかどうかを確認することができますが、それが必要であるかどうかは疑問です。私はそれがあなたが必要としているものに依存していると思いますが、ページの出力htmlが必要な場合は、awkまたはgrepにパイプされたwgetのようなものが不思議に働くことがあります。

2

ポールディクソンの答えはおそらく最良のアプローチですが、ジェシーの答えは言及する価値のあるものに触れています。

cURL - より正確には、libcURLは非常に強力なライブラリです。シェルスクリプトを実行したり、出力を解析する必要がなく、libCURLはC、C++などの言語で利用できます。 Qtがサポートしていないような奇妙な操作(ssl上のhttp POSTのような)をしていると便利です。

+0

QtがSSL経由でPOSTを処理できないことを誰でも確認できますか? – Andrioid

+1

@Andrioid Qtは問題なくSSL経由でPOSTを処理します。 –

+0

私はC-o-r-Eはqtがあなたにとってそれをしないということを意味していました。あなたはqtを解決策としてではなくツールとして使用するだけでしょうか? –

関連する問題