Как прочитать простой результат Json (из калькулятора Google) в Python?

Я пытаюсь проанализировать результат json из следующего запроса Google:

http://www.google.com/ig/calculator?hl=en&q=1USD=?MXN

Результат таков:

{lhs: "1 U.S. dollar",rhs: "13.3317335 Mexican pesos",error: "",icc: true}

Так что я просто пытаюсь расшифровать это:

import json, urllib2

j=urllib2.urlopen("http://www.google.com/ig/calculator?hl=en&q=1USD=?MXN")
print json.load(j)

Но у меня есть эта ошибка (Traceback):

Traceback (most recent call last):
  File "/home/rafael/gitSources/PythonConcept/Monpy/negApi.py", line 4, in <module>
    print json.load(j)
  File "/usr/lib/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 326, 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: Expecting property name: line 1 column 1 (char 1)
[Finished in 0.6s with exit code 1]

Я не знаю, что я делаю неправильно, я просто прочитал много уроков: /

Спасибо :)!

 Thomas Orozco11 июл. 2012 г., 10:09
JSON должно быть{"lhs": "1 U.S. dollar","rhs": "13.3317335 Mexican pesos","error": "","icc": true}.
 Ignacio Vazquez-Abrams11 июл. 2012 г., 10:03
Это не JSON.

Ответы на вопрос(3)

Ты можешь использоватьrate-exchange.appspot.com, который использует Google API, но возвращает действительный json:

http://rate-exchange.appspot.com/currency?from=USD&to=MXN&q=1
{"to": "MXN", "rate": 12.7523369, "from": "USD", "v": 12.7523369}

Вот как это использовать сrequests:

>>> import requests
>>> r = requests.get('http://rate-exchange.appspot.com/currency?from=USD&to=MXN&q=1')
>>> r.json['v']
12.7523369
Решение Вопроса

Это не JSON, но вы все равно можете разобрать его самостоятельно - вот так:

import ast

resp = '{lhs: "1 U.S. dollar",rhs: "13.3317335 Mexican pesos",error: "",icc: true}'

d = {}
for pair in resp[1:-1].split(','):
    (k,v) = pair.split(':')
    v = v.strip()
    if v == "true":
        v = "True"
    try:
        v = ast.literal_eval(v)
    except:
        print "Couldn't eval " + v
    d[k] = v

print d

Вы также можете исправить форматирование на json, а затем использовать анализатор json следующим образом:

import json

resp = '{lhs: "1 U.S. dollar",rhs: "13.3317335 Mexican pesos",error: "",icc: true}'

s = "{"    
for pair in resp[1:-1].split(','):
    (k,v) = pair.split(':')
    s += '"%s" : %s,' % (k,v)
s = s[:-1] + "}"

print json.loads(s)
 rafuru11 июл. 2012 г., 10:30
например, в for sintax вы переходите от 1 до -1?
 11 июл. 2012 г., 10:31
строка [1: -1] означает всю строку, кроме первого и последнего символа, затем разделяется на запятые, затем разделяется на двоеточия
 rafuru11 июл. 2012 г., 10:36
Спасибо !! :) последний вопрос, что такое (k, v)? ? это словарь? Я начинаю разрабатывать на python, и есть так много терминов, которые я не понимаю
 rafuru11 июл. 2012 г., 10:29
вау, это здорово ... но я хочу знать, что здесь происходит, пожалуйста :)
 11 июл. 2012 г., 10:40
(K, V) является кортеж .... и вы можете назначить список для кортежа так(a,b) = L это сокращение дляa=L[0], b=L[1]

Вот что вы должны сделать:

импорт ре

s = '{lhs: "1 U.S. dollar",rhs: "13.3317335 Mexican pesos",error: "",icc: true}'
only_numbers=re.sub(r'[^0-9,.]+', '', s)
m = re.match(r"(\d+..),(\d+.\d+),,", only_numbers)
currency=m.group(2)

выход: 13.3317335

Ваш ответ на вопрос