我需要检索HTML页面such as this的内容并将它们存储到String
以使用JSoup进一步解析它。问题是内容是从JavaScript动态生成的,尽管我进行了所有研究,但我似乎无法找到解决方案。
到目前为止,我已尝试使用不可见的WebView
并添加JavaScriptInterface
以便检索内容,如下所示:
webView = new WebView(this);
webView.setVisibility(View.GONE);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new HTMLListener(), "HTMLOUT");
String UA = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/20100101 Firefox/4.0";
settings.setUserAgentString(UA);
WebViewClient webViewClient = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
@Override
public void onPageStarted(WebView view, String url,
Bitmap favicon) {
}
public void onPageFinished(WebView view, String url) {
Log.d("Load", "load finished");
view.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
};
webView.setWebViewClient(webViewClient);
HTMLListener类:
private class HTMLListener {
@android.webkit.JavascriptInterface
public void processHTML(String html) {
doSomethingWithHTML(html);
}
}
现在这已经在API18上工作了(不知何故 - 我知道这个解决方案主要是hackish),但WebView行为在后来的一个API(API 21 IIRC)中发生了变化。看起来onPageFinished方法现在异步执行并且在呈现动态内容之前过早触发。
有什么方法可以解决这个问题?实际上,任何将动态Web内容存储到String
的解决方案都非常受欢迎。