【问题标题】:Python 3.0 urllib.parse error "Type str doesn't support the buffer API"Python 3.0 urllib.parse 错误“类型 str 不支持缓冲区 API”
【发布时间】:2009-02-12 07:24:05
【问题描述】:
  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 来获得它,但我似乎无法以其他任何方式做到这一点。

【问题讨论】:

    标签: python cgi python-3.x urllib


    【解决方案1】:

    urllib 正在尝试做的事情:

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

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

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

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

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

    【讨论】:

    • 是的。到目前为止,我已经注意到 cgi、urllib 和 wsgiref 的巨大问题。我希望他们能尽快修好。 :(
    • 确实如此。 WEB-SIG 的势头似乎已经停止。似乎没有人想要拥有这个问题的所有权。非常令人失望。
    • 我相信这应该最终在 3.2 中正常工作(参见 bugs.python.org/issue4953)。
    【解决方案2】:

    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)
    

    【讨论】:

    • 提供一个适用于两个版本的python的解决方案真的很有趣。
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2015-07-09
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多