File "/usr/local/lib/python3.0/cgi.py", line 477, in __init__
    self.read_urlencoded()
  File "/usr/local/lib/python3.0/cgi.py", line 577, in read_urlencoded
    self.strict_parsing):
  File "/usr/local/lib/python3.0/urllib/parse.py", line 377, in parse_qsl
    pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
TypeError: Type str doesn't support the buffer API

谁能告诉我如何避免这种情况?我得到它通过将数据输入的cgi.Fieldstorage,我似乎无法做到这一点任何其他方式。

有帮助吗?

解决方案

的urllib正试图做:

b'a,b'.split(',')

这是不行的。比他们用来字节串和unicode字符串混合甚至更少顺利地Py3k - 故意,使编码去错的问题宜早不宜迟

因此错误是相当不透明的,告诉你,你不能传递一个字节串到了urllib.parse“。大概你正在做一个POST请求,该表单编码字符串进入CGI作为内容主体;内容主体仍然是一个字节串/流,以便它现在使用新的urllib相撞。

所以,是的,它是在cgi.py一个bug,但2to3的转换的另一个受害者已经没有正确固定为新的字符串模式。它应该是将它们传递到的urllib之前转换该输入的字节流以字符。

我提到的Python 3.0的库(尤其是网络相关的)仍然相当shonky? : - )

其他提示

从Python教程( http://www.python.org/doc /3.0/tutorial/stdlib.html )存在使用的urlopen方法的一个例子。它提出了同样的错误。

for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
    if 'EST' in line or 'EDT' in line:  # look for Eastern Time
        print(line)

您需要使用str函数的字节thingo转换为字符串与正确的编码。如下:

for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
    lineStr = str( line, encoding='utf8' )
    if 'EST' in lineStr or 'EDT' in lineStr:  # look for Eastern Time
        print(lineStr)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top