2011-08-16 3 views
1

Mon code:Python 3.x: Erreur 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() 

Mon erreur:

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. 

J'ai essayé encode, mais il n'a pas aidé.

+1

duplication exacte de [TypeError: les données POST doivent être des octets ou des itérables d'octets. Il ne peut pas être str] (http://stackoverflow.com/questions/5440485/typeerror-post-data-should-be-bytes-or-an-iterable-of-bytes-it-cannot-be-str) –

Répondre

6

L'erreur que vous indique ce que vous faites mal:

« TypeError:. Données POST doivent être octets ou un itérable d'octets Il ne peut pas être str. »

Vous devez utiliser un type d'octets et non un type de chaîne pour les données POST. Si vous regardez votre type de données, en faisant type(data), vous verrez que c'est un str, mais ce devrait être un octet.

Si vous regardez alors au Python documentation on how to use urllib, vous y verrez l'exemple de poster un formulaire:

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

Ce qui vous indique comment rendre les données (appelés ici params) en octets au lieu de str .