在Python中读取JSON响应

时间:2015-10-22 13:21:43

标签: json python-2.7 selenium

我正在尝试从此link读取json响应。但它不起作用!我收到以下错误:

  

ValueError:无法解码JSON对象。

以下是我尝试过的代码:

import urllib2, json
a = urllib2.urlopen('https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?key=AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA&screenshot=true&snapshots=true&locale=en_US&url=https://www.economicalinsurance.com/en/&strategy=mobile&filter_third_party_resources=false&callback=_callbacks_._DElanZU7Xh1K')
data = json.loads(a)

我做了这些改变:

import requests, json
r=requests.get('https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?key=AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA&screenshot=true&snapshots=true&locale=en_US&url=https://www.economicalinsurance.com/en/&strategy=mobile&filter_third_party_resources=false')
json_data = json.loads(r.text)
print json_data['ruleGroups']['USABILITY']['score']

快速提问 - 构建图片链接。

我能够到达: -

from selenium import webdriver

txt = json_data['screenshot']['data']
txt = str(txt).replace('-','/').replace('_','/')
#then in order to construct the image link i tried : -
image_link = 'data:image/jpeg;base64,'+txt
driver = webdriver.Firefox()
driver.get(image_link)

问题是我没有得到图像,len(object_original)与len(image_link)相比也不同。有人可以建议我构建的图像链接中缺少正确的元素吗?谢谢

以下是API链接 - https://www.google.co.uk/webmasters/tools/mobile-friendly/抱歉,我迟到了。

2 个答案:

答案 0 :(得分:2)

需要对您的代码进行两次更正:

  1. 网址已更正(正如Felix Kling here所述)。您必须从发送的GET请求中删除callback参数。
  2. 此外,如果您检查之前提取的响应类型,您会发现它不是字符串。那是<type 'instance'>。由于json.loads()接受string作为参数变量,因此您会收到另一个错误。因此,使用a.read()获取string中的响应数据。
  3. 因此,这应该是您的代码:

    import urllib2, json
    a = urllib2.urlopen('https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?key=AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA&screenshot=true&snapshots=true&locale=en_US&url=https://www.economicalinsurance.com/en/&strategy=mobile&filter_third_party_resources=false')
    data = json.loads(a.read())
    

    回答第二次查询(关于图片)是:

    from base64 import decodestring
    
    arr = json_data['screenshot']['data']
    arr = arr.replace("_", "/")
    arr = arr.replace("-","+")
    
    fh = open("imageToSave.jpeg", "wb")
    fh.write(str(arr).decode('base64'))
    fh.close()
    

    此处是您尝试获取的图片 - Link

答案 1 :(得分:0)

Felix Kling对地址是正确的,但我也创建了一个包含URL的变量。你可以尝试这个,它应该工作:

import urllib2, json
url = "https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?key=AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA&screenshot=true&snapshots=true&locale=en_US&url=https://www.economicalinsurance.com/en/&strategy=mobile&filter_third_party_resources=false"
response = urllib2.urlopen(url)
data = json.loads(response.read())
print data