如何获取嵌入在 PhantomJS 运行的 JS 的 HTML 页面结果中的 JSON 对象并将它们传递给 java 代码?

How to get JSON objects embedded in HTML page result of JS running by PhantomJS and pass them to java code?

提问人:Yegane Ghayour 提问时间:1/7/2017 最后编辑:CommunityYegane Ghayour 更新时间:4/21/2017 访问量:482

问:

我使用此答案中描述的JS脚本代码,但我不想将html结果页面保存在html文件中。我想从中提取 Json 对象并将它们传递给 Java 代码。<div class="rg_meta">

在搜索中,我发现使用“文档”,但得到未定义的错误。我是 PhantomJS 的新手,在 Java 中使用 JSON。

var page = require('webpage').create();
var fs = require('fs');
var system = require('system');

var url = "";
var searchParameter = "";
var count=0;

if (system.args.length === 4) {
    url=system.args[1];
    searchParameter=system.args[2];
    count=system.args[3];
}

if(url==="" || searchParameter===""){
    phantom.exit();
}

page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';

page.zoomFactor = 0.1;

page.viewportSize = {
  width: 1920,
  height: 1080
};

var divCount="-1";
var topPosition=0;
var unchangedCounter=0;


page.open(url, function(status) {
console.log("Status: " + status);
if(status === "success") {

    window.setInterval(function() {

        var newDivCount = page.evaluate(function() { 
            var divs = document.querySelectorAll(".rg_di.rg_bx.rg_el.ivg-i");
            return divs[divs.length-1].getAttribute("data-ri");
        });

        topPosition = topPosition + 1080;

        page.scrollPosition = {
            top: topPosition,
            left: 0
        };

        if(newDivCount===divCount){
            page.evaluate(function() {
                var elems=document.getElementByClassName("rg_meta");
                console.log(elems.length);
                var button = document.querySelector("#smb");
                if(!(typeof button === "undefined")) {
                    button.click();
                    console.log('Clicked');
                    return true;
                }else{
                    return false;
                }
            });

            if(parseInt(unchangedCounter,10) === parseInt(count,10)){
               /* var path = searchParameter+'.html';
                fs.write('seedHtml/'+path, page.content, 'w');
                console.log('printing html');*/
                phantom.exit();
            }else{
                unchangedCounter=unchangedCounter+1;
            }
        }else{
            unchangedCounter=0;
        }
        divCount = newDivCount;

    }, 500);
}else{
    phantom.exit();
}
});
javascript java json phantomjs 参数传递

评论

0赞 Sadjad 1/8/2017
没有名为 的函数。它实际上是 (,而不是 )。我认为这就是你出错的原因。你能试试这个吗?document.getElementByClassNamedocument. getElementsByClassNameElementsElementundefined
0赞 Yegane Ghayour 1/8/2017
非常感谢,它不会返回错误,它现在返回 0 结果。
0赞 Sadjad 1/9/2017
好的,现在您可以使用它来打印它的内容。然后你可以在 Java 代码或其他地方使用它,我认为。console.log(elems[0])
0赞 Jairo Cordero 4/21/2017
div 元素可以使用数据属性,请到 sitepoint.com/use-html5-data-attributes 看看

答:

0赞 Jairo Cordero 4/21/2017 #1

HTML5 数据属性

幸运的是,HTML5 引入了自定义数据属性。

<div id="msglist" data-user="bob" data-list-size="5" data-maxage="180"></div>

自定义数据属性:

are strings — 您可以存储任何可以字符串编码的内容,例如 JSON类型转换必须在 JavaScript 中处理。仅当不存在合适的 HTML5 元素或属性时才应使用。

JavaScript 解析 #1:

每个浏览器都允许您使用 getAttributesetAttribute 方法获取和修改数据属性,例如

var msglist = document.getElementById("msglist");

var show = msglist.getAttribute("data-list-size");
msglist.setAttribute("data-list-size", show+3);

它可以工作,但只能用作旧浏览器的后备。

JavaScript 解析 #2:

从 1.4.3 版开始,jQuery 的 data() 方法解析了 HTML5 数据属性。您无需指定 data- 前缀,因此可以编写等效代码:

var msglist = $("#msglist");

var show = msglist.data("list-size");
msglist.data("list-size", show+3);

希望对你有所帮助!!