خطأ Python 3.0 Urllib.parse "Type Str لا يدعم API المخزن المؤقت"

StackOverflow https://stackoverflow.com/questions/540342

  •  22-08-2019
  •  | 
  •  

سؤال

  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 وأنا لا يبدو لي أن أفعل ذلك بأي طريقة أخرى.

هل كانت مفيدة؟

المحلول

Urllib تحاول القيام به:

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

الذي لا يعمل. تخلط سلاسل البايت سلاسل وأخطاء يونيكود أقل بسلاسة في PY3K مما كانت عليه - عمدا، لجعل مشاكل الترميز يحدث خطأ في عاجلا وليس أحدث.

لذا فإن الخطأ يخبرك بفضل "أنه لا يمكنك تمرير سلسلة بايت إلى Urllib.parse". من المفترض أنك تقوم بطلب نشر، حيث تأتي السلسلة المشفرة في النموذج إلى CGI كهيئة محتوى؛ لا تزال هيكل المحتوى سلسلة / دفق بايت حتى يصطاد الآن مع URLLIB الجديد.

لذلك نعم، إنه خطأ في CGI.py، بعد ضحية أخرى لتحويل 2to3 لم يتم إصلاحه بشكل صحيح لنموذج السلسلة الجديد. يجب أن يكون تحويل دفق البايت الوارد إلى الأحرف قبل تمريرها إلى Urllib.

هل ذكرت مكتبات بيثون 3.0 (خاصة تلك المتعلقة بالويب) لا تزال شونكي إلى حد ما؟ :-)

نصائح أخرى

من بيثون التعليمي ( 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 لتحويل BYTE 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top