无法解码 JSON 个对象(尽管数据确实存在)

No JSON object could be decoded (although data does exist)

我是 JSON 的新手。我 运行 下面的代码出现错误

import urllib2
import json
urllib2.urlopen('https://ciapipreprod.cityindextest9.co.uk/TradingApi')
print json.load(urllib2.open(`https://ciapipreprod.cityindextest9.co.uk/TradingApi'))

ValueError: No JSON object could be decoded

但是当我 运行 它没有 json 如下所示时,我可以看到里面是什么。

import urllib2
data=urllib2.urlopen('https://ciapipreprod.cityindextest9.co.uk/TradingApi')
html = data.read()
print html

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<meta name="viewport" content="width=device-width" />

<title>Ajax Test Harness</title>

<link href="/TradingAPI/Content/css?v=oI5uNwN5NWmYrn8EXEybCIbINNBbTM_DnIdXDUL5RwE1" rel="stylesheet" type="text/css" />

<link href="/TradingAPI/Content/themes/base/css?v=M29VGAPKJl__Ya5hV5ngguUfY8uNXwB076bG-JmFavY1" rel="stylesheet" type="text/css" />

<script src="/TradingAPI/Scripts/js?v=lYEohN8Pq3__VMPgz6C4ZXSyFUc0d6gVJQ28Wflqo3E1"></script>

</head>

<body>

    <div style="width: 100%; margin: 0px;">            

        <img alt="CityIndex Logo" src="/TradingAPI/Images/ci_white_logo.jpg"/>

</div>
<h2>Ajax Test Harness</h2>

<script src="/TradingAPI/Scripts/tradingApi.js" language="javascript" type="text/javascript"></script>

<script src="/TradingAPI/Scripts/corsTest.js" language="javascript" type="text/javascript"></script>

<script src="/TradingAPI/Scripts/json2.js" language="javascript" type="text/javascript"></script>

<div id="apitest">

<form id="form1" runat="server"></form>

<hr />
<h2>Test Harness</h2>

<button onclick=" eval($('#code').val()); ">Execute</button><br />

<textarea id="code" cols="120" rows="15">

    var userName = "DM631479";

    doPost('/session',{ "UserName": userName, "Password": "password"}, function (data, textCode) {    

        // Smoke Test

        doGet('/smoketest');



        setRequestHeader("UserName", userName);

        setRequestHeader("Session", data.Session);



        // Authentication Test

        doGet('/smoketest/authenticated');



        // Account Information Tests

        doGet('/useraccount/DM631479/ChartingEnabled');

        doGet('/useraccount/ClientAndTradingAccount');

        // Need Valid Test Data doPost('/useraccount/Save', {"PersonalEmailAddress":"not@realaddress.com","PersonalEmailAddressIsDirty":true})



        // Cfd Markets Test

        doGet('/cfd/markets?marketname=uk&maxresults=10&usemobileshortname=true');



        //Logoff

        doPost('/session/deleteSession?userName='+userName+'&session='+data.Session);

    });

    /* var userName = "DM631479";

        cityindex.corsTesting.doPost('/session',{ "UserName": userName, "Password": "password"}, function (data, textCode) {    

        });*/

    </textarea>

<br />

<select id="result" style="background-color: #e4e4e4; min-height: 300px;" multiple="multiple"></select>

<hr />

</div>



</body>

</html>

我的理解是,如果我的 var 'Data' 中有“{}”,它们就是 "dictionaries",然后我可以使用 JSON 模块调用它们。

也许我误读了变量的内容,也许 JSON 到 'load'

实际上没有任何内容

如果此处的任何标记有误或不合格,我们深表歉意。

JSON 有 a particular specified shape ,该响应不符合。你所拥有的是嵌入在 HTML 中的 JavaScript(有些 JavaScript 是有效的 JSON)。它类似于这个例子:

<pre><code>print("Hello World")</code></pre>

其中 包含 Python 代码,但总的来说不是有效的 Python 代码。为了提取数据,您需要找到一个不同的端点来命中,该端点会产生有效的 JSON(否则您将不得不提取 JavaScript 上的 JSON-like 部分使用 html.parser built into the standard library, a library like bs4 或正则表达式搜索您感兴趣的页面)。然后您可以将有效的 JSON 文本提供给 json.loads 并使用它。

在我看来 url returns html,而不是 json。此外,从 print 语句来看,结果看起来页面中根本没有嵌入任何 json。

json.load 仅适用于看起来与 json 完全相同的输入,即看起来像字典的东西。它不会把它从周围的 html 中拉出来。

如果该页面上的某处有 json,例如,在脚本标记中,您首先必须解析 html 以提取它。你可以用漂亮的汤或 scrapy 来做。