2016-07-01 11 views
0

PyQtを使用してhttp GETリクエストを送信します。PyQtでhttpリクエストを送信するには?

私の研究にもかかわらず、私はPythonでのその単純な操作の例は見つかりませんでした。

私はいくつかのコード(コメントにBakuriuのヒントに基づいて修正しました)がありましたが、うまくいきません。私がFacebookのWebページにリクエストをして、そのページのHTMLコンテンツであるべき答えを印刷したいとしましょう。

from PyQt4 import QtCore, QtNetwork, QtCore, QtGui 
from PyQt4.QtCore import * 
import sys 
from functools import partial 

def printContent(): 
    answerAsText = QString(replyObject.readAll()) 
    print answerAsText 

app = QtCore.QCoreApplication(sys.argv) 

url = QtCore.QUrl("http://www.facebook.com") 
request = QtNetwork.QNetworkRequest() 
request.setUrl(url) 
manager = QtNetwork.QNetworkAccessManager() 

replyObject = manager.get(request) 
replyObject.finished.connect(printContent) 

sys.exit(app.exec_()) 

これはエラーを発生させず、何も印刷しません。 問題の原因はわかりません: リクエストが間違っていますか? それは後で返信オブジェクトを処理する方法ですか?

なぜ機能しないのですか?誰かが私に機能しているコードを表示してもらえますか?

+0

'QNetworkReply'は' QIODevice'なので、[readData'と 'readLineData'](http://doc.qt.io/qt-5/qiodevice.html#protected-functions)メソッドを提供します。 – Bakuriu

+0

ええ、私はすでにその方向で検索しました。しかし、私はそれがどのように機能するのか分かりません。すべての関数(read、readAll、readData、readLine)はQByteArraysを返します。私はそれらをどうするべきか分かりません。 + readDataは、私が得ることのできないint引数をとります。このオブジェクトをどのように扱うかについて、もう少し詳しく教えてください。 –

+0

'QByteArray'は単なるテキストです。あなたがテキストとしてそれをしたいならば、単に 'text = QString(data)'を実行することができます。 – Bakuriu

答えて

0

URLのように見えますが、悪い例です。 www.google.comをお試しください。私はあなたのコードをPyQt5に適合させました。できます。

from PyQt5.QtCore import QUrl 
from PyQt5.QtWidgets import QApplication, QMainWindow 
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest 
import sys 

def printContent(): 
    answerAsText = bytes(replyObject.readAll()).decode("utf-8") 
    print(answerAsText) 


class mainClass(): 
    def my_exception_hook(exctype, value, traceback): 

     print(exctype, value, traceback) 

     sys._excepthook(exctype, value, traceback) 
     sys.exit(1) 

    sys.excepthook = my_exception_hook 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    url = QUrl("http://www.google.com") 

    request = QNetworkRequest() 
    request.setUrl(url) 
    manager = QNetworkAccessManager() 

    replyObject = manager.get(request) 
    replyObject.finished.connect(printContent) 

    sys.exit(app.exec_()) 
0

我々は、信号とスロットの仕組みを使っているので、我々は、QApplicationまたはQtCoreApplicationを作成する必要があります。また、応答はQByteArrayからデコードする必要があることにも注意してください。ここで

は実施例である:

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

from PyQt5 import QtCore, QtGui, QtNetwork 
import sys 


class Example: 

    def __init__(self):  

     self.doRequest() 


    def doRequest(self): 

     url = "http://www.something.com" 
     req = QtNetwork.QNetworkRequest(QtCore.QUrl(url)) 

     self.nam = QtNetwork.QNetworkAccessManager() 
     self.nam.finished.connect(self.handleResponse) 
     self.nam.get(req)  


    def handleResponse(self, reply): 

     er = reply.error() 

     if er == QtNetwork.QNetworkReply.NoError: 

      bytes_string = reply.readAll() 
      print(str(bytes_string, 'utf-8')) 

     else: 
      print("Error occured: ", er) 
      print(reply.errorString()) 

     QtCore.QCoreApplication.quit()  


if __name__ == '__main__':  

    app = QtCore.QCoreApplication([]) 
    ex = Example() 
    sys.exit(app.exec_()) 

あなたがこのアプリケーションを実行した場合、あなたは非常に簡単なWebページ(www.something.com)のHTMLコードを取得します。

関連する問題