Python urllib2 : URL에서 JSON 응답 수신


90

Python을 사용하여 URL을 얻으려고하는데 응답은 JSON입니다. 그러나 내가 달리면

import urllib2
response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
html=response.read()
print html

html은 str 유형이며 JSON이 필요합니다. 응답을 str 대신 JSON 또는 python 사전으로 캡처 할 수있는 방법이 있습니까?


1
되어 response.read()유효한 JSON 문자열을 반환?
Martijn Pieters

예 그것의 유효한 JSON 문자열 그것의 다만 또는 유형 str 및 dict가 아닙니다
Deepak B

객체 (dict)의 JSON 표현이 아니라 문자열의 JSON 표현 인 경우 서버가 다른 데이터를 반환하도록 강제 할 수 없습니다. 다른 요청을해야 할 수도 있습니다. JSON 표현을 동등한 Python 객체로 구문 분석하는 방법을 모르는 경우 Martjin Pieters의 대답이 맞습니다.
abarnert

답변:


183

URL이 유효한 JSON 인코딩 데이터를 반환하는 경우 json라이브러리 를 사용하여 디코딩합니다.

import urllib2
import json

response = urllib2.urlopen('https://api.instagram.com/v1/tags/pizza/media/XXXXXX')
data = json.load(response)   
print data

1
@ ManuelSchneid3r : 여기에 대답은 읽는 것은 파이썬 2입니다 response당신이 bytestrings 및 제공 json.load()bytestring을 읽을 것으로 예상하고있다. JSON UTF 코덱을 사용하여 인코딩 해야 하며, 위의 내용은 UTF-8, UTF-16 및 UTF-32에서 작동합니다. 단, 후자의 두 코덱에 BOM 코드 포인트가 포함되어 있습니다. 당신이 연결하는 대답은 UTF-8이 사용되었다고 가정 합니다. 이것이 기본값이기 때문에 일반적으로 정확합니다. Python 3.6부터 json라이브러리는 UTF 인코딩이 사용되는 경우 JSON 데이터로 바이트 코드를 자동 디코딩합니다.
Martijn Pieters

@ ManuelSchneid3r : 그렇지 않으면 requestsBOM이없고 응답 헤더에 문자 세트가 지정되지 않은 경우 사용할 올바른 UTF 코덱을 자동으로 감지 하는 라이브러리 를 사용하는 것이 좋습니다 . response.json()방법을 사용하십시오 .
Martijn Pieters

35
import json
import urllib

url = 'http://example.com/file.json'
r = urllib.request.urlopen(url)
data = json.loads(r.read().decode(r.info().get_param('charset') or 'utf-8'))
print(data)

urllib , Python 3.4 용
HTTPMessage , r.info ()에서 반환


1
print dataPython 3에 대한 잘못된 코드 이외의 솔리드 코드는 print(data).
David Metcalfe

1
예, 2 행은이어야합니다 import urllib.request. 또한 URL의 해당 .json 파일이 더 이상 존재하지 않습니다.
hack-tramp

5
"""
Return JSON to webpage
Adding to wonderful answer by @Sanal
For Django 3.4
Adding a working url that returns a json (Source: http://www.jsontest.com/#echo)
"""

import json
import urllib

url = 'http://echo.jsontest.com/insert-key-here/insert-value-here/key/value'
respons = urllib.request.urlopen(url)
data = json.loads(respons.read().decode(respons.info().get_param('charset') or 'utf-8'))
return HttpResponse(json.dumps(data), content_type="application/json")

1
그 json.dumps ()가 내 하루를 구했습니다.
Lloyd

Django 1.7 +의 경우 다음과 같이 JsonResponse를 직접 사용할 수 있습니다 from django.http import JsonResponse return JsonResponse({'key':'value'})
raccoon

1
나는 json.dumps () 대신 json.dump ()를하고 있었고, 멍청한 느낌이 들었다. 저장해 주셔서 감사합니다!
Hashir 베이 그

4

유효성 검사 등에 대해주의를 기울이십시오. 그러나 직접적인 해결책은 다음과 같습니다.

import json
the_dict = json.load(response)

2
resource_url = 'http://localhost:8080/service/'
response = json.loads(urllib2.urlopen(resource_url).read())

1

Python 3 표준 라이브러리 한 줄 :

load(urlopen(url))

# imports (place these above the code before running it)
from json import load
from urllib.request import urlopen
url = 'https://jsonplaceholder.typicode.com/todos/1'

0

이미 대답 한 것 같지만 여기에 조금 더하고 싶습니다

import json
import urllib2
class Website(object):
    def __init__(self,name):
        self.name = name 
    def dump(self):
     self.data= urllib2.urlopen(self.name)
     return self.data

    def convJSON(self):
         data=  json.load(self.dump())
     print data

domain = Website("https://example.com")
domain.convJSON()

참고 : json.load ()에 전달 된 객체는 .read ()를 지원해야 하므로 urllib2.urlopen (self.name) .read () 가 작동하지 않습니다. 전달 된 Doamin은 프로토콜과 함께 제공되어야합니다.이 경우 http


0

requests아래와 같이 사용하여 json을 얻을 수도 있습니다.

import requests

r = requests.get('http://yoursite.com/your-json-pfile.json')
json_response = r.json()

0

이것은 귀하의 질문에 대한 또 다른 간단한 해결책입니다.

pd.read_json(data)

여기서 데이터는 다음 코드의 str 출력입니다.

response = urlopen("https://data.nasa.gov/resource/y77d-th95.json")
json_data = response.read().decode('utf-8', 'replace')

-1

여기에 제공된 예제 중 어느 것도 나를 위해 일하지 않았습니다. Python 2 (uurllib2) 용이거나 Python 3 용 파일이 "ImportError : No module named request"오류를 반환합니다. 나는 오류 메시지를 구글에 검색하고 분명히 모듈을 설치해야한다. 이것은 명백히 그러한 간단한 작업에는 허용되지 않는다.

이 코드는 나를 위해 일했습니다.

import json,urllib
data = urllib.urlopen("https://api.github.com/users?since=0").read()
d = json.loads(data)
print (d)

2
여러분은 분명히 Python 2를 사용하고 계십니다. Python 3에는 urllib.urlopen; urlopenurllib.request모듈.
Nick Matteo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.