Ошибка Python 3.0 urllib.parse «Тип str не поддерживает API-интерфейс буфера»

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 и я не могу сделать это иначе.

  • TypeError: не может конкатенировать объекты 'str' и 'instance' (python urllib)
  • В чем отличия между модулем urllib, urllib2 и запросов?
  • Многопоточный веб-скребок с использованием urlretrieve на сайте с поддержкой cookie
  • Используя Python для входа на сайт, заполните форму и выйдите из нее.
  • Загрузка большого файла в ошибку python: сжатый файл закончился до того, как был достигнут маркер конца потока
  • Почему я получаю атрибут AttributeError при попытке распечатать
  • urllib.urlopen работает, но urllib2.urlopen не
  • Сделайте запрос http POST для загрузки файла с помощью python urllib / urllib2
  • 2 Solutions collect form web for “Ошибка Python 3.0 urllib.parse «Тип str не поддерживает API-интерфейс буфера»”

    urllib пытается сделать:

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

    Что не работает. байтовые строки и строки Юникода смешиваются еще менее плавно в Py3k, чем они привыкли, – сознательно, чтобы проблемы с кодировкой шли неправильно раньше, чем позже.

    Таким образом, ошибка довольно непрозрачно говорит вам: «Вы не можете передать байтовую строку в urllib.parse». Предположительно, вы делаете запрос POST, где строка, закодированная в форме, входит в cgi как тело контента; тело содержимого по-прежнему является байтовой строкой / потоком, так что теперь он сталкивается с новым urllib.

    Так что да, это ошибка в cgi.py, еще одна жертва преобразования 2to3, которая не исправлена ​​должным образом для новой строковой модели. Он должен преобразовывать входящий поток байтов в символы перед передачей их в urllib.

    Я упоминал библиотеки Python 3.0 (особенно связанные с веб-сайтами), все еще довольно шонки? 🙂

    Из учебника 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 - лучший язык программирования в мире.