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

Android中使用Jsoup提取谷歌翻译网页译文失败如何解决

解决Jsoup抓取Google翻译译文为空的问题

嘿,我懂你遇到的麻烦了——用Jsoup爬Google翻译页面时能拿到静态文本,但译文就是空的,这其实是个很常见的问题,核心原因在于Google翻译的译文是通过JavaScript动态渲染出来的,而Jsoup只能解析页面的静态HTML源码,根本不会执行页面里的JS,自然拿不到后续加载的译文内容。

为什么会这样?

你可以自己验证一下:打开那个翻译URL,右键选择「查看页面源代码」(不是「检查」调出的Elements面板),然后搜索"India is my country",你会发现完全找不到这段译文——因为它是页面加载完成后,通过JS请求接口并渲染到页面上的,静态源码里根本没有。

解决方案一:用WebView获取动态渲染后的HTML(适合Android端)

既然Jsoup搞不定JS渲染,那我们可以先让Android的WebView加载页面并执行JS,等页面完全渲染完成后再获取完整的HTML,最后用Jsoup解析。

下面是示例代码:

// 初始化WebView(记得在布局里添加WebView组件)
WebView translateWebView = findViewById(R.id.translate_webview);
WebSettings webSettings = translateWebView.getSettings();
webSettings.setJavaScriptEnabled(true); // 必须启用JS

translateWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 调用JS获取完整的页面HTML
        view.evaluateJavascript("document.documentElement.outerHTML", html -> {
            // 用Jsoup解析动态生成的HTML
            Document doc = Jsoup.parse(html);
            // 注意:Google翻译的DOM结构可能会随时变化,你需要自己检查当前页面的元素选择器
            // 比如当前版本中,译文可能在class为"result-container"的元素里(实际要以Elements面板为准)
            String engText = doc.select(".result-container").text();
            // 这里就可以拿到译文了,记得切换到主线程更新UI
            runOnUiThread(() -> {
                // 处理你的engText,比如显示到TextView
            });
        });
    }
});

// 加载翻译页面
translateWebView.loadUrl("https://translate.google.com/#hi/en/bharat%20mera%20desh%20hai");

解决方案二:使用Google翻译官方API(推荐!)

爬网页的方式有两个致命问题:一是Google的DOM结构经常变,你的代码可能随时失效;二是频繁爬取可能违反Google的服务条款,甚至被封IP。所以更靠谱的方式是用官方的Translation API。

步骤大概是:

  1. 去Google Cloud控制台创建项目,启用「Cloud Translation API」,获取你的API密钥。
  2. 在Android项目中用OkHttp/Retrofit调用API接口。

示例代码(用OkHttp):

OkHttpClient client = new OkHttpClient();
String apiKey = "你的Google Cloud API密钥";
String sourceLang = "hi"; // 源语言:印地语
String targetLang = "en"; // 目标语言:英语
String textToTranslate = "bharat mera desh hai";

// 构建请求
Request request = new Request.Builder()
        .url(String.format("https://translation.googleapis.com/language/translate/v2?key=%s&source=%s&target=%s&q=%s",
                apiKey,
                sourceLang,
                targetLang,
                URLEncoder.encode(textToTranslate, StandardCharsets.UTF_8)))
        .build();

// 异步请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
        // 处理请求失败的情况
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String responseJson = response.body().string();
            // 解析JSON拿到译文
            JSONObject jsonObject = new JSONObject(responseJson);
            String translatedText = jsonObject.getJSONObject("data")
                    .getJSONArray("translations")
                    .getJSONObject(0)
                    .getString("translatedText");
            
            // 切换到主线程更新UI
            runOnUiThread(() -> {
                // 使用translatedText,比如显示到界面上
            });
        }
    }
});

额外提醒

如果非要坚持爬网页,记得给Jsoup设置合理的User-Agent,避免被识别为爬虫:

Document doc = Jsoup.connect("https://translate.google.com/#hi/en/bharat%20mera%20desh%20hai")
        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
        .get();

但还是那句话,这种方式不稳定,优先用官方API。

内容的提问来源于stack exchange,提问作者Rahul Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:09:52