2011-08-16 17 views
1

マイコード:のPython 3.xの:urllib.requestエラー

import urllib.request, urllib.parse, urllib.error 

def login(): 
    url = 'http://rsbot.lt/news.php' 
    values = {'user_name' : 'Name', 
      'user_pass' : 'Password' } 

    data = urllib.parse.urlencode(values) 
    req = urllib.request.Request(url, data) 
    response = urllib.request.urlopen(req) 
    return response.read() 

login() 

マイエラー:

Traceback (most recent call last): 
    File "C:\Users\Myrez\Desktop\test.py", line 13, in <module> 
login() 
File "C:\Users\Myrez\Desktop\test.py", line 10, in login 
response = urllib.request.urlopen(req) 
File "C:\Python32\lib\urllib\request.py", line 138, in urlopen 
return opener.open(url, data, timeout) 
File "C:\Python32\lib\urllib\request.py", line 367, in open 
req = meth(req) 
File "C:\Python32\lib\urllib\request.py", line 1066, in do_request_ 
raise TypeError("POST data should be bytes" 
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str. 

私はエンコードを試みたが、それは助けにはなりませんでした。

「はTypeError::。。POSTデータがバイトまたはバイトの反復可能でなければなりませんそれはstrをすることができません」

+1

[TypeError:POSTデータの正確な重複は、バイトまたはバイトの反復可能である必要があります。それはstrすることはできません](http://stackoverflow.com/questions/5440485/typeerror-post-data-should-be-bytes-or-an-iterable-of-bytes-it-cannot-be-str) –

答えて

6

エラーは、あなたが間違ってやっていることがわかります

POSTデータのstrタイプではなく、バイトタイプを使用する必要があります。 データ型を調べて、type(data)を実行すると、それがstrであることがわかりますが、バイトでなければなりません。

あなたは、Python documentation on how to use urllibを見れば、あなたはそこにフォームをポストする方法の例が表示されます。データを作成する方法を説明します

>>> import urllib.request 
>>> import urllib.parse 
>>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) 
>>> params = params.encode('utf-8') 
>>> f = urllib.request.urlopen("http://www.musi-cal.com/cgi-bin/query", params) 

(ここでのparamsと呼ばれる)の代わりにSTRのバイトに。

関連する問題