Frage

  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

Kann jemand leitet mich auf, wie dies zu vermeiden? Ich bin es durch Zuführung von Daten in die cgi.Fieldstorage bekommen und ich kann nicht scheinen, um es auf andere Weise zu tun.

War es hilfreich?

Lösung

urllib versucht zu tun:

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

Welche funktioniert nicht. Byte-Strings und Unicode-Strings in Py3k noch weniger glatt mischen als früher -. bewusst, Encoding Probleme eher falsch früher gehen zu machen, als später

So wird der Fehler eher deckend zu sagen Sie sind Sie nicht ein Byte String übergeben kann urllib.parse '. Vermutlich tun Sie eine POST-Anforderung, wobei die Form-codierte Zeichenfolge in cgi als Content-Körper kommt; der Inhalt Körper ist immer noch ein Byte-String / Strom, so dass es jetzt mit dem neuen urllib kollidiert.

Also ja, es ist ein Fehler in cgi.py, noch ein weiteres Opfer von 2to3-Konvertierung, die richtig für das neue String-Modell nicht fixiert wurde. Es soll den ankommenden Byte-Strom zu Zeichen konvertieren, bevor sie in urllib vorbei.

Habe ich erwähnt, Python 3.0 Bibliotheken (insbesondere webbezogenen sind) noch eher shonky zu sein? : -)

Andere Tipps

Aus den Python-Tutorial ( http://www.python.org/doc /3.0/tutorial/stdlib.html ) ist ein Beispiel der Verwendung urlopen Methode. Es stellt sich die gleichen Fehler.

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)

Sie müssen die str Funktion verwenden, um das Byte thingo in einen String mit der richtigen Codierung zu konvertieren. Wie folgt:

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top