Python 3.0 urllib.parse 오류 "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에 들어오는 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top