You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何从EngineSession爬取其显示JSON对应的HTML内容?

解决EngineSession获取渲染内容的方案

1. 自定义EngineSession扩展(适用于可修改引擎实现的场景)

如果EngineSession是项目自定义组件或引擎支持扩展,直接添加类似WebView的JS执行接口:

  • 在EngineSession实现类中新增方法:
    public void evaluateJavascript(String script, ValueCallback<String> callback) {
        // 内部执行JS脚本,直接获取页面文本或HTML
        String content = internalExecuteJs(script);
        callback.onReceiveValue(content);
    }
    
  • 调用时执行engineSession.evaluateJavascript("document.body.textContent", callback),直接拿到渲染的JSON文本。

2. 拦截引擎网络请求(最直接的原始JSON获取方式)

既然展示的是纯JSON,引擎必然先发起网络请求获取数据,直接拦截请求拿到原始JSON:

  • 若引擎使用OkHttp等可拦截的网络库,添加拦截器:
    OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(chain -> {
            Response response = chain.proceed(chain.request());
            // 读取响应体的原始JSON
            String rawJson = response.body().string();
            // 保存JSON到业务逻辑层(注意重新构建响应体,因为body.string()仅可调用一次)
            return response.newBuilder()
                .body(ResponseBody.create(rawJson, response.body().contentType()))
                .build();
        })
        .build();
    
  • 将配置好的客户端传入EngineSession,在请求阶段直接获取JSON,无需从渲染层提取。

3. 利用导出功能的间接提取(应急方案)

虽然requestPrintContent()或requestPdfToDownload()无法直接获取HTML,但可解析导出内容反向提取JSON:

  • 触发导出请求,获取文档流后解析文本内容(因渲染的是纯JSON,导出内容即为纯文本格式);
  • 该方式效率较低,仅适合临时应急场景。

4. 替换为WebView(备选方案)

若以上方法均不可行,直接替换为WebView,使用熟悉的evaluateJavascript():

webView.evaluateJavascript("document.body.textContent", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String value) {
        // 处理获取到的JSON内容
    }
});

内容的提问来源于stack exchange,提问作者Taslim Oseni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:16:04