Python 3.x: ошибка urllib.request - PullRequest
       9

Python 3.x: ошибка urllib.request

1 голос
/ 16 августа 2011

Мой код:

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.

Я пытался кодировать, но это не помогло.

1 Ответ

6 голосов
/ 17 августа 2011

Ошибка говорит вам, что вы делаете неправильно:

"Ошибка типа: данные POST должны быть байтами или итерируемыми байтами. Это не может быть str."

Вы должны использовать тип байтов, а не тип str для данных POST. Если вы посмотрите на ваш тип данных, выполнив type(data), вы увидите, что это str, но это должны быть байты.

Если вы посмотрите документацию Python о том, как использовать 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)

Что говорит о том, как преобразовать данные (здесь называемые параметрами) в байты вместо строки.

...