没有JSON对象可以被解码(尽管数据确实存在)

时间:2015-11-16 13:55:07

标签: html json python-2.7 urllib2

我是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'中有'{}',那么它们就是“词典”,然后我可以使用JSON模块调用它们。

也许我误读了变量的内容,也许JSON没有任何东西可以“加载”

很抱歉,如果此处的任何标记错误或不合格。

2 个答案:

答案 0 :(得分:0)

JSON有here,该响应不符合。你所拥有的是嵌入在HTML中的JavaScript(以及一些JavaScript是有效的JSON)。它与这个例子类似:

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

包含 Python代码,但总体上不是有效的Python代码。为了提取数据,您需要找到一个不同的端点来生成有效的JSON(否则您将需要使用{{3在您感兴趣的页面上提取JavaScript的类似JSON的部分)内置于标准库,像a particular specified shape的库或正则表达式)。然后,您可以将有效的JSON文本提供给json.loads并使用它。

答案 1 :(得分:0)

在我看来,url会返回html,而不是json。另外,从print语句来看,结果看起来并不像页面中嵌入了任何json。

json.load只能使用看起来像json的输入,这看起来像字典。它不会将其从周围的HTML中拉出来。

如果在该页面的某个地方有json,比如说,在脚本标签中,你首先必须解析html来提取它。你可以使用美丽的汤或scrapy。