Python 3.0 urllib.parse 오류 "str 유형은 버퍼 API를 지원하지 않습니다."
-
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에 들어오는 POST 요청을 수행하고 있을 것입니다.콘텐츠 본문은 여전히 바이트 문자열/스트림이므로 이제 새 urllib와 충돌합니다.
그렇습니다, 그것은 cgi.py의 버그입니다. 새로운 문자열 모델에 대해 제대로 수정되지 않은 2to3 변환의 또 다른 희생자입니다.들어오는 바이트 스트림을 urllib에 전달하기 전에 문자로 변환해야 합니다.
Python 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 함수를 사용하여 바이트 theo를 올바른 인코딩으로 문자열로 변환해야합니다. 다음과 같이 :
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)
제휴하지 않습니다 StackOverflow