웹 페이지에서 Python 스크립트로 JSON을 얻는 방법


193

내 스크립트 중 하나에 다음 코드가 있습니다.

#
# url is defined above.
#
jsonurl = urlopen(url)

#
# While trying to debug, I put this in:
#
print jsonurl

#
# Was hoping text would contain the actual json crap from the URL, but seems not...
#
text = json.loads(jsonurl)
print text

내가하고 싶은 일은 {{.....etc.....}}Firefox에서 스크립트로로드 할 때 URL에서 볼 수있는 것을 가져 와서 값을 구문 분석 할 수 있다는 것입니다. 나는 톤을 Google로 만들었지 만 실제로 는 파이썬 스크립트의 객체로 {{...}}끝나는 URL 에서 물건을 얻는 방법에 대한 좋은 대답을 찾지 못했습니다 .json.

답변:


316

URL에서 데이터를 가져온 다음 json.loads예를 들어

Python3 예제 :

import urllib.request, json 
with urllib.request.urlopen("http://maps.googleapis.com/maps/api/geocode/json?address=google") as url:
    data = json.loads(url.read().decode())
    print(data)

Python2 예 :

import urllib, json
url = "http://maps.googleapis.com/maps/api/geocode/json?address=google"
response = urllib.urlopen(url)
data = json.loads(response.read())
print data

결과는 다음과 같습니다.

{
"results" : [
    {
    "address_components" : [
        {
            "long_name" : "Charleston and Huff",
            "short_name" : "Charleston and Huff",
            "types" : [ "establishment", "point_of_interest" ]
        },
        {
            "long_name" : "Mountain View",
            "short_name" : "Mountain View",
            "types" : [ "locality", "political" ]
        },
        {
...

30
json.loads문자열 사용 을 소비하는 .read()사용 json.load(response)대신 ( 이것이 필요한 이유 대신 사용)
awatts

PSL 전용, 간결하고 효율적
jlandercy

urllib2Python2 바람직?
Jon-Eric

110

실제로 URL에서 데이터를 가져오고 싶다고 생각합니다.

jsonurl = urlopen(url)
text = json.loads(jsonurl.read()) # <-- read from it

또는 요청 라이브러리 에서 JSON 디코더 를 확인하십시오 .

import requests
r = requests.get('someurl')
print r.json() # if response type was set to JSON, then you'll automatically have a JSON response here...

이 질문에 녹색 배지가 필요합니다! 감사!
Aziz Alto

27

Python 2.X 및 Python 3.X가 포함 된 웹 페이지에서 JSON 형식의 사전을 가져옵니다.

#!/usr/bin/env python

try:
    # For Python 3.0 and later
    from urllib.request import urlopen
except ImportError:
    # Fall back to Python 2's urllib2
    from urllib2 import urlopen

import json


def get_jsonparsed_data(url):
    """
    Receive the content of ``url``, parse it as JSON and return the object.

    Parameters
    ----------
    url : str

    Returns
    -------
    dict
    """
    response = urlopen(url)
    data = response.read().decode("utf-8")
    return json.loads(data)


url = ("http://maps.googleapis.com/maps/api/geocode/json?"
       "address=googleplex&sensor=false")
print(get_jsonparsed_data(url))

JSON 읽기 및 쓰기 예제 도 참조하십시오.


24

파이썬 3을 사용할 때 웹 페이지에서 JSON을 얻는 가장 쉽고 효율적인 방법이라는 것을 알았습니다.

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

4
작동하지 않습니다. urllib.request에서 urlopen을 가져와야합니다. 즉from urllib.request import urlopen
Dawid Laszuk

5

docsurlopen() 에 따른 호출은 모두 파일과 같은 객체를 반환합니다. 일단 당신이 그것을 호출해야합니다read() 실제로 네트워크를 통해 JSON 데이터를 가져 오기 메소드를 합니다.

다음과 같은 것 :

jsonurl = urlopen(url)

text = json.loads(jsonurl.read())
print text

5

Python 2에서는 json.loads () 대신 json.load ()가 작동합니다.

import json
import urllib

url = 'https://api.github.com/users?since=100'
output = json.load(urllib.urlopen(url))
print(output)

불행히도, 그것은 파이썬 3에서 작동하지 않습니다. json.load는 파일과 같은 객체에 대해 read ()를 호출하는 json.loads의 래퍼입니다. json.loads에는 문자열 객체가 필요하고 urllib.urlopen (url) .read ()의 출력은 bytes 객체입니다. 따라서 파이썬 3에서 작동하려면 파일 인코딩을 가져와야합니다.

이 예제에서 우리는 인코딩을 위해 헤더를 쿼리하고 그것을 얻지 못하면 utf-8로 넘어갑니다. headers 객체는 Python 2와 3이 다르므로 다른 방식으로 수행해야합니다. 요청 을 사용하면 이 모든 것을 피할 수 있지만 때로는 표준 라이브러리를 고수해야합니다.

import json
from six.moves.urllib.request import urlopen

DEFAULT_ENCODING = 'utf-8'
url = 'https://api.github.com/users?since=100'
urlResponse = urlopen(url)

if hasattr(urlResponse.headers, 'get_content_charset'):
    encoding = urlResponse.headers.get_content_charset(DEFAULT_ENCODING)
else:
    encoding = urlResponse.headers.getparam('charset') or DEFAULT_ENCODING

output = json.loads(urlResponse.read().decode(encoding))
print(output)

나는 6이 표준 라이브러리의 일부가 아니라는 것을 알고 있지만 편의를 위해 여기에 표시되어 있습니다. 그것이 없으면 urlopen ()을 얻을 수있는 곳을 결정하기 위해 if / else 또는 try / except 블록이 필요합니다.
aviso 2016 년

3

json을 구문 분석하기 위해 추가 라이브러리를 사용할 필요가 없습니다 ...

json.loads()사전을 반환합니다 .

따라서 귀하의 경우에는 text["someValueKey"]


3

늦은 답변이지만 python>=3.6다음을 사용할 수 있습니다.

import dload
j = dload.json(url)

다음을 사용 dload하여 설치 :

pip3 install dload

-1

당신은 사용할 수 있습니다 json.dumps:

import json

# Hier comes you received data

data = json.dumps(response)

print(data)

json을로드하고 파일에 쓰려면 다음 코드가 유용합니다.

data = json.loads(json.dumps(Response, sort_keys=False, indent=4))
with open('data.json', 'w') as outfile:
json.dump(data, outfile, sort_keys=False, indent=4)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.