2010-01-26 4 views
2

Google 검색 API를 사용하여 Google에 검색어를 제공하고 처음 10 개의 결과를 다운로드하는 Python 프로그램을 작성 중입니다. 다음과 같이 파이썬 2.6에서이 작업을 수행 할 수 있었다 :Google 검색 결과를 파이썬 3.1 json으로 변환

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false) 
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \ 
      % (query) 
results = urllib.urlopen(url) 
resultsjson = json.loads(results.read()) 
betterResults += resultsjson["responseData"]["results"] 

구글의 검색 API는 JSON으로 결과를 반환, 그래서 내의 JSON으로 결과를 다운로드하고리스트로 구문 분석을 위의 코드를 사용 (betterResults).

파이썬 3으로 전환했을 때, 프로그램이 예외를 던지기 시작했습니다. 분명히 Python 2.6에서 urlopen()에 의해 반환 된 객체는 json에로드 할 수있는 파일과 유사한 객체입니다. Python 3.1에서 반환 된 객체는 HTTPResponse 객체입니다.이 객체는 json 사양에서 요구하는 read() 메서드를 포함하지만 바이트 객체입니다. 따라서 2.6에있는 정보에 액세스 할 수 없었습니다.

Google에서 반환 한 json에 액세스 할 수있는 방법이 있습니까? 어떻게 파이썬 3에서 결과를 얻을 수 있고 내가 원하는 필드를 선택할 수있을 것인가? json으로 할 수 있었기 때문에?

는 BSG, 대단히 감사

답변

1

urlopen에 의해 반환 된 객체가 인 경우 파일이 잘못되었습니다. 그러나 문자열을 예상하는 json.loads()를 사용합니다. json.load()는 object와 같은 파일을 필요로합니다.

그러나 json.load()는 read() 메서드의 결과가 문자열이 될 것으로 예상하지만 물론 읽는 바이트는 바이트가되므로 바이트에서 문자열로 먼저 디코딩해야합니다.

그래서,이 같은 :

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false) 
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \ 
      % (query) 
results = urllib.urlopen(url) 
encoding = input.getheader('content-type').split('=')[-1] 
resultsjson = json.loads(results.read().decode(encoding)) 
betterResults += resultsjson["responseData"]["results"] 

는 작동 할 수 있습니다. (나는 그것을 시험하지 않았다).

2

당신이 loads 함수에 매개 변수를 인코딩 통과 json.loads

resultjson = json.loads(results.read().decode()) 

docs also suggest와 함께 사용하려는 경우가 바이트 오브젝트를 디코딩해야합니다 :

json.loads(results.read(), encoding=<encoding-type>) 

저는 Lennart가 인코딩 유형을 얻는 방법에 대해 설명해 왔다고 생각합니다.