Question

  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

Quelqu'un peut-il me diriger sur la façon d'éviter cela? Je l'obtenir grâce à des données d'alimentation dans le cgi.Fieldstorage et je ne peux pas sembler le faire autrement.

Était-ce utile?

La solution

urllib essaie de faire:

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

Ce qui ne fonctionne pas. chaînes d'octets et les chaînes unicode se mélangent encore moins en douceur dans Py3K que par le passé -. délibérément, de faire des problèmes de codage vont mal plutôt tôt que tard

Alors l'erreur est plutôt vous dire « opaque que vous ne pouvez pas passer une chaîne d'octets à urllib.parse ». Je présume que vous faites une requête POST, où la chaîne codée forme est entrée en cgi comme un corps contenu; le corps de contenu est encore une chaîne d'octets / flux de sorte qu'il se heurte maintenant avec la nouvelle urllib.

Alors oui, il est un bogue dans cgi.py, une autre victime de la conversion 2to3 qui n'a pas été fixé correctement pour le nouveau modèle de chaîne. Il devrait être convertir le flux d'octets entrant en caractères avant de les transmettre à urllib.

Ai-je mentionné les bibliothèques de Python 3.0 (en particulier ceux liés au Web) étant encore assez shonky? : -)

Autres conseils

Dans le tutoriel python ( http://www.python.org/doc /3.0/tutorial/stdlib.html ) il y a un exemple d'utilisation de la méthode urlopen. Il soulève la même erreur.

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)

Vous devez utiliser la fonction str pour convertir le thingo d'octets en une chaîne avec l'encodage correct. Comme suit:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top