2014-09-07 2 views
1

내 스크립트 작동하지만 가끔 오류로 충돌 :JSON에 ValueError : 종결되지 않은 문자열

Traceback (most recent call last): 
    File "planetafm.py", line 6, in <module> 
    songs = json.loads(json_data) 
    File "/usr/lib/python2.7/json/__init__.py", line 338, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Unterminated string starting at: line 1 column 32 (char 31) 

예를 들어, 그 JSON이 발생합니다

rdsData({"now":{"id":"0052-55","title":"Summertime Sadness (Radio Mix)","artist":"Lana Del Rey","startDate":"2014-09-07 21:48:51","duration":"2014-09-07 21:48:51"}}) 

소스 코드 :

import requests, json, re 

url = "http://rds.eurozet.pl/reader/var/planeta.json" 
response = requests.get(url) 
json_data = re.match('rdsData\((.*?)\)', response.content).group(1) 
songs = json.loads(json_data) 
print (songs['now']['artist'] + " - " + songs['now']['title']).encode('utf-8') 

왜 그 json은 유효하지 않습니까? 이 문제를 해결하는 방법?
답변 해 주셔서 감사합니다.

답변

3

정규 표현식에 텍스트 내부의 괄호를 닫는 데 문제가 있습니다. 정규 표현식에 $를 추가하여 문제를 해결할 수 있습니다.

import requests, json, re 

url = "http://rds.eurozet.pl/reader/var/planeta.json" 
response = requests.get(url) 
print response.content 
json_data = re.match('rdsData\((.*?)\)$', response.content).group(1) 
print json_data 
songs = json.loads(json_data) 
print (songs['now']['artist'] + " - " + songs['now']['title']).encode('utf-8') 
+0

했다 감사합니다. – CodeNinja

1

추출 방법에 결함이 있습니다.

>>> import re 
>>> import requests 
>>> url = "http://rds.eurozet.pl/reader/var/planeta.json" 
>>> r = requests.get(url) 
>>> re.match('rdsData\((.*?)\)', r.content).group(1) 
'{"now":{"id":"0052-55","title":"Summertime Sadness (Radio Mix' 

정규 표현식을 사용하는 대신, 단지 str.partition()str.rpartition()를 사용하여 값을 분할 : 당신의 표현은 처음 ) 문자에서 종료

url = "http://rds.eurozet.pl/reader/var/planeta.json" 
response = requests.get(url) 
json_data = response.content.partition('(')[-1].rpartition(')')[0] 
songs = json.loads(json_data) 

데모 :

>>> json_data = r.content.partition('(')[-1].rpartition(')')[0] 
>>> json.loads(json_data)['now'] 
{u'duration': u'2014-09-07 21:48:51', u'startDate': u'2014-09-07 21:48:51', u'artist': u'Lana Del Rey', u'id': u'0052-55', u'title': u'Summertime Sadness (Radio Mix)'} 
관련 문제