【问题标题】:Get JSON page content with PhantomJS使用 PhantomJS 获取 JSON 页面内容
【发布时间】:2012-02-11 07:48:07
【问题描述】:

我想知道如何在 phantomjs 中解析 JSON。任何页面内容都包含在 html (<html><body><pre>{JSON string}</pre></body></html>) 中。是否有删除封闭标签或要求不同的 Content-Type 作为“application/json”的选项?如果不是,那么解析它的最佳方法是什么。包含 includeJS jQuery 后是否使用 jQuery?

【问题讨论】:

    标签: json phantomjs


    【解决方案1】:

    如果 json 数据包含 html 字符串,它们将在建议的page.plainText 属性中被删除。

    【讨论】:

    • 我刚试了一下,并没有从json中删除html字符串。
    【解决方案2】:

    正如已在接受的答案中一样,我建议使用JSON.parse() 将 JSON 字符串转换为对象。

    例如,您的代码可能如下所示:

    var jsonObject = page.evaluate(function() {
      return JSON.parse(page.plainText);
    });
    

    【讨论】:

    • 对于投反对票的人来说,这是一种有效的方法。我知道 jQuery 对于 JSON 解析可能有点矫枉过正,但请礼貌地解释你的反对意见。谢谢。
    • @CameronTinker 为什么不使用原生 javascript JSON.parse ??为什么要包含一个不需要的库?
    • 我已更新此答案以将 jQuery 作为依赖项删除。
    【解决方案3】:

    由于您使用的是由 webkit 浏览器构建的 PhantomJS,因此您可以访问本机 JSON 库。无需使用page.evaluate,只需使用page对象的plainText属性即可。

    http://phantomjs.org/api/webpage/property/plain-text.html

    var page = require('webpage').create();
    page.open('http://somejsonpage.com', function () {
        var jsonSource = page.plainText;
        var resultObject = JSON.parse(jsonSource);
        phantom.exit();
    });
    

    【讨论】:

    【解决方案4】:

    这是我所做的:

    var obj = page.evaluate(function() {
        return eval('(' + document.body.innerText + ')');
    }
    

    那么你得到的 obj 就是从那个页面返回的 JSON 对象。

    【讨论】:

    • obj 为空。这段代码很好,并记录 JSON:page.open(encodeURI(url), function(status){ if( status !== "success"){ ... } else { console.log( page.content ); phantom。 exit(); } 但不是这个:page.open(encodeURI(url), function(status){ if( status !== "success"){ ... } else { var obj = page.evaluate(function( ) { return eval('(' + document.body.innerText + ')'); }); console.log(obj) phantom.exit(); page.evaluate 还是很神秘的!难道 eval 不应该被丢弃吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多