2012-12-29 9 views
1

저는 python을 처음 사용하여 urllib을 사용하여 musicbrainz에서 JSON 데이터를 가져 오려고 시도 중이며 일부 데이터를 구문 분석 할 수 있습니다. 그러나 일부 아티스트의 경우 JSON 데이터의 특정 필드/키는 필요하지 않을 수 있으므로 제공되지 않습니다. 추가 필터 기준에 따라 가져온 JSON 데이터를 필터링하는 방법을 잘 모르겠습니다.필터는 Python의 특정 기준에 따라 JSON 데이터를 가져 왔습니다.

아래 예제에서 릴리스 목록 >> 릴리스 >> 릴리스 그룹 >> 유형이 '단일'로 설정된 경우에만 가져온 JSON 데이터를 필터링해야합니다. 가져온 JSON은 최대 50 번까지 반복 할 수 있지만 'Single'카테고리의 필터 만 추가로 필터링 할 수 있습니다. 어떻게 할 수 있는지 알려주세요. 감사!

샘플 JSON :

{ 
    "created": "2012-12-27T13:22:55.834Z", 
    "recording-list": { 
     "count": 3, 
     "offset": 0, 
     "recording": [{ 
      "score": "100", 
      "title": "Stronger", 
      "artist-credit": { 
       "name-credit": [{ 
        "artist": { 
         "name": "Britney Spears", 
         "sort-name": "Spears, Britney" 
        } 
       }] 
      }, 
      "release-list": { 
       "release": [{ 
        "id": "13c5511f-1f99-4ffe-97d5-562c05e9d8d5", 
        "title": "Hit Hammer 2001 (disc 1)", 
        "status": "Official", 
        "artist-credit": { 
         "name-credit": [{ 
          "artist": { 
           "id": "89ad4ac3-39f7-470e-963a-56509c546377", 
           "name": "Various Artists" 
          } 
         }] 
        }, 
         "release-group": { 
         "id": "6c4c2cc3-3d8e-3a19-9d46-da076c34b6e9", 
         "type": "Compilation", 
         "primary-type": "Album", 
         "secondary-type-list": { 
          "secondary-type": ["Compilation"] 
         } 
        }, 
        "medium-list": { 
         "track-count": 20, 
         "medium": [{ 
          "position": 1, 
          "track-list": { 
           "count": 20, 
           "offset": 0, 
           "track": [{ 
            "number": "1", 
            "title": "Stronger", 
            "length": 203266 
           }] 
          } 
         }] 
        } 
       }] 
      } 
     }, { 
      "id": "feb9acbf-1d3d-4395-9512-bfbdcfa72eb9", 
      "score": "100", 
      "title": "Stronger", 
      "artist-credit": { 
       "name-credit": [{ 
        "joinphrase": "", 
        "artist": { 
         "name": "Britney Spears", 
         "sort-name": "Spears, Britney" 
        } 
       }] 
      }, 
      "release-list": { 
       "release": [{ 
        "id": "45e2a271-2f6b-4029-b11e-b6d94d169f9a", 
        "title": "Stronger: The Remixes", 
        "status": "Official", 
        "release-group": { 
         "id": "4d018ba8-f05e-4817-8c70-34307161a0fc", 
         "type": "Single", 
         "primary-type": "Single" 
        }, 
        "date": "2000-12-12", 
        "country": "US", 
        "medium-list": { 
         "track-count": 6, 
         "medium": [{ 
          "position": 1, 
          "format": "CD", 
          "track-list": { 
           "count": 6, 
           "offset": 0, 
           "track": [{ 
            "number": "1", 
            "title": "Stronger", 
            "length": 203000 
           }] 
          } 
         }] 
        } 
       }] 
      }, 
      "puid-list": { 
       "puid": [{ 
        "id": "28550845-c68a-314d-90c1-010dff730f4a" 
       }] 
      } 
     }] 
    } 
} 

파이썬 코드 :

def get_mbid(artist, song): 
    artist=urllib.quote_plus(artist) 
    song=urllib.quote_plus(song) 
    recording_url = 'http://search.musicbrainz.org/ws/2/recording/?&fmt=json&query=artist:"'+artist+'"%20AND%20recording:"'+song+'"' 
    search_results = urllib.urlopen(recording_url) 

    json = simplejson.loads(search_results.read()) 
    search_results.close() 
    if json['recording-list']['count'] == 0: 
     return get_mbid_artist(artist) 
    else: 
     recordings = json['recording-list']['recording'] 
     for recording in recordings: 
      mbid = recording['artist-credit']['name-credit'][0]['artist']['id'] 
      print mbid 
+0

정말로 '기본 유형'을 필터링하고 싶습니다. 'type'은 더 이상 사용되지 않고'primary-'와'secondary-type'으로 대체되고 있습니다. 검색어 URL에 필터를 추가하지 않으시겠습니까? '& primary-type = Single'을 추가하면됩니다. –

+0

안녕 Martijn, 제안 주셔서 감사합니다하지만 작동하는 것, 조스 덤프 여전히 URL에 주 유형을 전달 나와 함께 동일하게 보입니다. http://musicbrainz.org/ws/2/recording?&fmt=json&query=artist%3A"Britney+Spears"++AND+recording%3A"Stronger"&primary-type=Single –

+0

맞습니다. 녹음 된 내용이 반환되고있는 것 같습니다. 거기에 적어도 * 싱글 릴리스가 있습니다. 어떤 종류의 필터링이 필요합니까? 당신은 항상 릴리스를 반복 할 수 있으며, 싱글 인 것들만 처리 할 수 ​​있습니다. –

답변

0

http://musicbrainz.org/ws/2/recording?&query=artist%3A%22Britney+Spears%22+AND+recording%3A%22Stronger%22+AND+primarytype%3ASingle

primarytypeSingle 당신에게 녹음을 제공 할 것입니다. 인코딩없이

는 :

artist:"Britney Spears" AND recording:"Stronger" AND primarytype:Single

은 참조 : Web Service Search. 물론 fmt=json을 다시 추가 할 수 있습니다. 방금 브라우저에서 XML을 읽는 것이 더 쉬워서 그 부분을 제거했습니다.


나는 또한 XML Web Service의 현재 버전에 대한 python library 있다는 것을주의하고 싶다.

관련 문제