Python 3.x : urllib. 请求错误

标签 python python-3.x urllib

我的代码:

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。”

您应该为 POST 数据使用 bytes 类型,而不是 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)

它告诉您如何将数据(这里称为参数)转换为字节而不是 str。

关于Python 3.x : urllib. 请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081488/

相关文章:

python - urllib IncompleteRead() 错误我可以通过重新请求来解决吗?

Python:如何从一行值创建一个完整的距离矩阵?

python - 生成具有不同范围的嵌套列表

python - 在 Python 中使用内置 str() 类型的潜在异常

python - 替换 urllib.request.urlopen(url, ca*) 的开启器

python - 使用 Python 将 .sql 文件转换为文本表

python - Python中signal handler和atexit handler的调用

java - 处理大量数据的程序或库

python - 集合并集

python - 如何处理来自 urllib.request.urlopen() 的响应编码,以避免 TypeError : can't use a string pattern on a bytes-like object