无法理解和分析JSON URL响应

无法理解和分析JSON URL响应,json,python-3.x,web-scraping,beautifulsoup,Json,Python 3.x,Web Scraping,Beautifulsoup,我有一个json url,我试图从响应中提取数据。下面是我的代码 url = urllib2.urlopen("https://i1.adis.ws/s/foo/M0011126_001_SET.js?func=app.mjiProduct.handleJSON&protocol=https") content = url.read() soup = BeautifulSoup(content, "html.parser") print(soup.prettify()) print(so

我有一个json url,我试图从响应中提取数据。下面是我的代码

url = urllib2.urlopen("https://i1.adis.ws/s/foo/M0011126_001_SET.js?func=app.mjiProduct.handleJSON&protocol=https")
content = url.read()
soup = BeautifulSoup(content, "html.parser")
print(soup.prettify())
print(soup.items)
newDictionary=json.loads(str(soup))
下面是回复

app.mjiProduct.handleJSON({“名称”:“M0011126_001_集”,“项”:[{“类型”:“img”,“src”:”https://i1.adis.ws/i/foo/M0011126_001_MAIN“,“宽度”:3200,“高度”:4800,“格式”:“TIFF”,“不透明”:“真”},{“类型”:“img”,“src”:”https://i1.adis.ws/i/foo/M0011126_001_ALT1“,“宽度”:3200,“高度”:4800,“格式”:“TIFF”,“不透明”:“真”},{“类型”:“img”,“src”:"https://i1.adis.ws/i/foo/M0011126_001_ALT2“,“宽度”:3200,“高度”:4800,“格式”:“TIFF”,“不透明”:“真”}]})

我是JSON新手,无法理解响应。此外,我需要以JSON或某种形式解析响应以提取图像源。但是上面的代码给出了以下错误

无法解码任何JSON对象


有人能给我指点一下吗?首先谢谢你的url不起作用,它返回
app.mjiProduct.handleJSON({“status”:“error”,“errorMsg”:“设置失败”});

第二件事是,您不必将内容传递给Beautifulsoup,您可以直接将其传递给json,就像我在下面的代码中没有Beautifulsoup对象时所做的那样

我使用了
httpbin
进行测试,但这应该可以在您的url中使用

from urllib.request import urlopen
import json
url = urlopen("http://httpbin.org/get")
content = url.read()
newDictionary=json.loads(content)
print(newDictionary)

输出:
{'args':{},'headers':{'Accept-Encoding':'identity','Connection':'close','Host':'httpbin.org','User-Agent':'Python urllib/3.6'},'origin':'','url':'http://httpbin.org/get“}

下面是为我工作的代码

json_data=url.read()
purify_data = json_data.split('handleJSON(')[1].split(');')[0]
loaded_json = json.dumps(json_data)
print(loaded_json['items'][0]['src'])
实际上,我发现json_数据是string类型的,我无法解码,因为该字符串的格式是

app.mjiProduct.handleJSON(必需的JSON)


因此,首先我过滤了我的字符串,然后用json加载它,问题就解决了。

响应中不包含有效的json。它看起来像一个可执行代码(可能是JavaScript)。但是部分
{“name”:“M0011126_001_SET”,“items”:[…]}
是有效的JSON。因此,如果您确定响应始终采用这种格式,则可以如下方式剥离函数调用:

content = url.read()[26:-2] # Cut first 26 characters and last two
newDictionary=json.loads(str(content))
我不太了解这道靓汤,但我发现它是一个用于处理HTML文件的库,而您的响应不是HTML,所以我认为您不应该使用它