1
回答
htmlunit执行网页输出结果的问题
华为云4核8G,高性能云服务器,免费试用   

(一)环境:

1.网页:http://www.example.com/line.html      (网站有调用外部js,页面中也有部分js脚本改变网页实际的输出,脚本执行后,页面中body部分只保留一串文本)

2.HtmlUnit

3.Java开发环境

(二)需实现的功能

java通过htmlUnit,获取http://www.example.com/line.html的实际输出(不是源码)。

(三)例子

line.html

<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="height:400px"></div>
    <!-- ECharts单文件引入 -->
    <script src="http://echarts.baidu.com/build/dist/echarts.js"></script>
    <script type="text/javascript">
		var myChart;
        // 路径配置
        require.config({
            paths: {
                echarts: 'http://echarts.baidu.com/build/dist'
            }
        });
        
        // 使用
        require(
            [
                'echarts',
                'echarts/chart/bar', // 使用柱状图就加载bar模块,按需加载
				'echarts/chart/line'
            ],
            function (ec) {
                // 基于准备好的dom,初始化echarts图表
                myChart = ec.init(document.getElementById('main')); 
				myChart.setTheme("macarons");
                
                var option = {
    title : {
        text: '某楼盘销售情况',
        subtext: '纯属虚构'
    },
    tooltip : {
        trigger: 'axis'
    },
    legend: {
        data:['意向','预购','成交']
    },
    toolbox: {
        show : true,
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
    calculable : true,
    xAxis : [
        {
            type : 'category',
            boundaryGap : false,
            data : ['周一','周二','周三','周四','周五','周六','周日']
        }
    ],
    yAxis : [
        {
            type : 'value'
        }
    ],
	animation : false,
    series : [
        {
            name:'成交',
            type:'line',
            smooth:true,
            itemStyle: {normal: {areaStyle: {type: 'default'}}},
            data:[10, 12, 21, 54, 260, 830, 710]
        },
        {
            name:'预购',
            type:'line',
            smooth:true,
            itemStyle: {normal: {areaStyle: {type: 'default'}}},
            data:[30, 182, 434, 791, 390, 30, 10]
        },
        {
            name:'意向',
            type:'line',
            smooth:true,
            itemStyle: {normal: {areaStyle: {type: 'default'}}},
            data:[1320, 1132, 601, 234, 120, 90, 20]
        }
    ]
};
                    
        
                // 为echarts对象加载数据 
                myChart.setOption(option); 
				
				var imgUrl = myChart.getDataURL();
				var obj = document.getElementsByTagName("body");
				obj[0].innerHTML = imgUrl.substring(22);
				//console.log(obj);
            }
        );
    </script>
</body>



网页实际输出:

iVBORw0KGgoAAAANSUhEUgAABPAAAAGQCAYAAAAgD57……后面省略



Java代码:

WebClient wc = new WebClient(BrowserVersion.CHROME);
wc.getOptions().setJavaScriptEnabled(true); // 启用JS解释器,默认为true
//wc.getOptions().setCssEnabled(false);// 禁用css支持
wc.getOptions().setThrowExceptionOnScriptError(false);// js运行错误时,是否抛出异常
wc.getOptions().setTimeout(10000); // 设置连接超时时间,这里是10S。如果为0,则无限期等待
HtmlPage page = wc.getPage("http://localhost:8080/line.html");
System.out.println(page.getBody().getTextContent());



实际上没达到我想要的结果,输出还是网页源码。

有什么方法,或者第三方插件能达到我想要的效果?


举报
莫铭
发帖于3年前 1回/1K+阅

请问楼主你这个问题解决了吗,我也遇到同样的问题了。

我是需要在后台不通过浏览器获取echarts的图片,phantomjs在一部分系统下能解决这个问题,但是在有些操作系统不适用。

我于是想在页面上用echarts的getDataUrl()方法生成base64码,然后用htmlunit解析出来,结果发现htmlunit解析的base64码并不正确,与正常浏览器解析的不一样。

 

 

顶部