2016-08-16 3 views
0

칸 아카데미에서 수학 질문을 오프라인으로 복사하는 프로그램을 만들고 싶습니다. 나는 모든 연습 문제에 대한 데이터가 포함 된 21.6MB의 엄청난 텍스트 파일을 가지고 있지만, 어떻게 분석을 시작해야할지 모르겠다.이 JSON 데이터 블록을 어떻게 시작하나요?

Here은 JSON 데이터의 샘플이 들어있는 pastebin입니다. 모든 것을보고 싶다면 here을 찾을 수 있습니다. 긴로드 시간에 대한 경고.

이전에는 JSON을 사용 해본 적이 없지만 데이터의 개별 "하위 블록"(또는 이와 동등한 정확한 용어)을로드하기 위해 빠른 Python 스크립트를 작성했습니다.

import sys 
import json 

exercises = open("exercises.txt", "r+b") 
byte = 0 
frontbracket = 0 
backbracket = 0 
while byte < 1000: #while byte < character we want to read up to 
        #keep at 1000 for testing purposes 
    char = exercises.read(1) 
    sys.stdout.write(char) 
    #Here we decide what to do based on what char we have 
    if str(char) == "{": 
     frontbracket = byte 
     while True: 
      char = exercises.read(1) 
      if str(char)=="}": 
       backbracket=byte 
       break 
     exercises.seek(frontbracket) 
     block = exercises.read(backbracket-frontbracket) 
     print "Block is " + str(backbracket-frontbracket) + " bytes long" 
     jsonblock = json.loads(block) 
     sys.stdout.write(block) 
     print jsonblock["translated_display_name"] 
     print "\nENDBLOCK\n" 


    byte = byte + 1 
+1

중첩 된 대괄호를 고려하지 않고 있습니다. 스택을 사용하여이를 추적 할 수 있습니다. – danielfranca

+1

[jsonlint] (http://jsonlint.com/)와 같은 것을 사용하여 적어도 JSON의 일부를 복사하여 붙여 넣을 수 있습니다. 나는 거기에 반복 된 패턴을 발견했다고 생각하지만 실제로 어떤 데이터를 찾고 있는지 알고 있습니까? 'json'에로드하면 중첩 된 목록 및 사전처럼 취급 할 수 있습니다. – roganjosh

+1

이것은 반복 패턴 인 것으로 보입니다. http://pastebin.com/4nSnLEFZ – roganjosh

답변

1

좋아, 반복 패턴이 나타납니다 : http://pastebin.com/4nSnLEFZ

응답의 구조의 아이디어를 얻으려면, 당신은 문자열의/붙여 넣기 부분과 '검증'을 복사 JSONlint를 사용할 수 있습니다. 복사 한 부분이 유효하지 않은 경우에도 실제로 읽을 수있는 형식으로 서식을 지정합니다.

먼저 나는 requests 라이브러리를 사용하여 JSON을 가져 왔습니다. 이런 일을 처리 할 때 매우 단순한 라이브러리입니다. API는 모든 것을 꺼내기 때문에 느리게 반응하지만 제대로 작동합니다.

API로부터 응답을 받으면 .json()을 사용하여 직접 파이썬 객체로 변환 할 수 있습니다. 가지고있는 것은 본질적으로 중첩 된 목록과 사전을 혼합하여 특정 세부 사항을 반복하고 반복 할 수 있습니다. 아래 예제에서 my_list2try/except 구조를 사용해야합니다. 일부 항목의 목록에 translated_problem_types 아래에 두 개의 항목이 없어 보이기 때문입니다. 이 경우 대신 '없음'을 입력합니다. 그러한 일에 시행 착오를 사용해야 할 수도 있습니다.

마지막으로 JSON을 사용하지 않았으므로 사전 자체처럼 작동 할 수 있습니다. 세부 사항을받는 순서가 보장되는 것은 아닙니다. 그러나이 경우에는 가장 바깥 쪽 구조가 목록 인 것처럼 보이기 때문에 이론적으로 일관된 순서가 있지만 의존하지 않을 수도 있습니다. 목록 작성 방법을 알지 못합니다.

import requests 

api_call = requests.get('https://www.khanacademy.org/api/v1/exercises') 
json_response = api_call.json() 

# Assume we first want to list "author name" with "author key" 
# This should loop through the repeated pattern in the pastebin 
# access items as a dictionary 
my_list1 = [] 

for item in json_response: 
    my_list1.append([item['author_name'], item['author_key']]) 

print my_list1[0:5] 

# Now let's assume we want the 'sha' of the SECOND entry in translated_problem_types 
# to also be listed with author name 

my_list2 = [] 

for item in json_response: 
    try: 
     the_second_entry = item['translated_problem_types'][0]['items'][1]['sha'] 
    except IndexError: 
     the_second_entry = 'None' 

    my_list2.append([item['author_name'], item['author_key'], the_second_entry]) 
print my_list2[0:5] 
+0

대단히 감사합니다! 이제는 이것을 테이블로 사용하여 질문 텍스트를 가져 오는 방법을 알아 냈습니다. 나는 "상대 URL"항목으로 향하는 웹 스크래퍼를 생각하고 있습니다. 다시 감사합니다! – Xeneficus

+0

@ Xeneficus 매우 환영합니다 :) API 응답은 내가 가지고있는 방식대로 파고 들기가 번거롭다. 아마도 API 자체에 대해 조금 더 이해해야 요청을 대상으로하고 관심있는 정보 만 얻을 수 있습니다. 이것은 a) 응답 시간을 향상시키고 b) item [ 'translated_problem_types'] [0 ] [ 'items'] [1] [ 'sha']'를 사용하십시오. 행운을 빌어 요 :) – roganjosh

관련 문제