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。
步骤大概是:
- 去Google Cloud控制台创建项目,启用「Cloud Translation API」,获取你的API密钥。
- 在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
相关产品推荐
相关产品推荐

