23
  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,我似乎无法以任何其他方式做到这一点。

4

2 回答 2

28

urllib 正在尝试做:

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

这是行不通的。字节字符串和 unicode 字符串在 Py3k 中的混合比以前更不流畅——故意让编码问题早点而不是晚点出错。

所以错误是相当不透明地告诉你'你不能将字节字符串传递给 urllib.parse'。大概你正在做一个 POST 请求,其中表单编码的字符串作为内容体进入 cgi;内容主体仍然是字节字符串/流,因此它现在与新的 urllib 冲突。

所以,是的,这是 cgi.py 中的一个错误,也是 2to3 转换的另一个受害者,尚未针对新的字符串模型正确修复。它应该将传入的字节流转换为字符,然后再将它们传递给 urllib。

我有没有提到 Python 3.0 的库(尤其是与 Web 相关的库)仍然相当陈旧?:-)

于 2009-02-12T16:14:50.133 回答
13

从 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)
于 2010-01-29T01:13:39.583 回答