2015-02-02 3 views
0

Я получаю эти данные от поставщика, например, http://domain.com/abc.jsОбработка данных JSONP на Python 2.7?

I = { 
     t: '2015/02/02 16:01', 
     c: '207.05', 
     v: '484.74', 
     n: '324.37' 
}; 

Как именно я должен извлечь «V» значение на Python 2.7? Я слышал, что это JSONP, а не настоящий JSON, который, похоже, не так много людей имеет опыт в этом.

+0

Поскольку формат изменен, вот как выглядят фактические данные: http://pastebin.com/3BfzzYnm –

+0

Это очень трудно понять, не зная правил формата (например, всегда будет 4 символа перед открытием { литься?) и как часто этот формат будет изменяться. В основном это то, что WSDL были изобретены для: описания и правил управления версиями, и без чего-то подобного вам нужно задать те же вопросы, что и любой, кто построил интерфейс. –

ответ

0

JSONP предназначен для использования функцией обратного вызова JavaScript. В Python нет безопасного и простого способа разобрать его. И эти данные JSONP кажутся мне немного странными, поскольку ключи являются именами переменных, а не строками.

В любом случае, если вы чувствуете себя безрассудно, вы могли сделать это:

#! /usr/bin/env python 

import re 

datastr = ''' 
I = { 
    t: '2015/02/02 16:01', 
    c: '207.05', 
    v: '484.74', 
    n: '324.37' 
} 
''' 

def main(): 
    pat = re.compile(r'([a-z]+):') 
    exec pat.sub(r"'\1':", datastr) 
    print I, I['v'] 

if __name__ == '__main__': 
    main() 

выход

{'c': '207.05', 'n': '324.37', 't': '2015/02/02 16:01', 'v': '484.74'} 484.74 

Приведенный выше код использует регулярное выражение процитировать ключи преобразования их в правильные строки, чтобы данные соответствовали синтаксису Python dict и затем использовали exec для создания dict.

Обратите внимание, что использование данных exec или eval по данным, которые вы не контролируете, является опасной практикой. См. Eval really is dangerous by Stack Overflow stalwart Ned Batchelder.

+0

import re import urllib2 def main(): urlreq = urllib2.Request ('http://www.domain.com/test.js', headers = {'User-Agent': 'Mozilla/5.0' }) погладить = re.compile (г '([AZ] +):') Exec pat.sub (г " '\ 1':", urlreq) печати I, I [ 'v'] если __name__ == '__main__': основной() ______________________________________________ TraceBack (самый последний вызов последнего): Файл "I_2.py", линия 12, в main() Файл «I_2.py», строка 7, в основном exec pat.sub (r "'\ 1':", urlreq) ТипError: ожидаемая строка или буфер –

+0

Просьба ** не ** опубликовать многострочный код или отслеживать комментарии: читать почти невозможно. URL-адрес 'http: // www.domain.com/test.js' возвращает ошибку 404' Страница не найдена'. Но чтобы получить HTML-код из urllib2.Request, вам сначала нужно открыть объект Request, например 'handle = urllib2.urlopen (urlreq)'. _If_, который преуспевает (который вы должны проверить с помощью блока try: ... except IOError), вы можете получить содержимое URL как строку с помощью 'handle.read()'; заголовки страниц возвращаются 'handle.info()'. –

+0

Если вам нужна дополнительная помощь с 'urllib2.Request', пожалуйста, задайте новый вопрос (конечно, сначала найдите существующие ответы). –

Смежные вопросы