Android 如何从WebView检索HTML内容(作为字符串)
如何检索WebView中当前显示的所有HTML内容 我找到了Android 如何从WebView检索HTML内容(作为字符串),android,webview,android-webview,Android,Webview,Android Webview,如何检索WebView中当前显示的所有HTML内容 我找到了WebView.loadData(),但找不到相反的等价物(例如WebView.getData()) 请注意,我对检索我无法控制的网页的数据感兴趣(即,我无法将Javascript函数注入这些网页,以便它在WebView中调用Javascript接口)。不幸的是,这不是一个简单的方法 看 您只需对与WebView相同的页面进行HttpRequest并获得响应。您可以通过以下方式实现此目的: final Context myApp = t
WebView.loadData()
,但找不到相反的等价物(例如WebView.getData())
请注意,我对检索我无法控制的网页的数据感兴趣(即,我无法将Javascript函数注入这些网页,以便它在WebView中调用Javascript接口)。不幸的是,这不是一个简单的方法 看
您只需对与WebView相同的页面进行HttpRequest并获得响应。您可以通过以下方式实现此目的:
final Context myApp = this;
/* An instance of this class will be registered as a JavaScript interface */
class MyJavaScriptInterface
{
@SuppressWarnings("unused")
public void processHTML(String html)
{
// process the html as needed by the app
}
}
final WebView browser = (WebView)findViewById(R.id.browser);
/* JavaScript must be enabled if you want it to work, obviously */
browser.getSettings().setJavaScriptEnabled(true);
/* Register a new JavaScript interface called HTMLOUT */
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
/* WebViewClient must be set BEFORE calling loadUrl! */
browser.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
/* This call inject JavaScript into the page which just finished loading. */
browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
});
/* load a web page */
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html");
final Context myApp=this;
/*此类的实例将注册为JavaScript接口*/
类MyJavaScriptInterface
{
@抑制警告(“未使用”)
公共空处理html(字符串html)
{
//根据应用程序的需要处理html
}
}
最终WebView浏览器=(WebView)findViewById(R.id.browser);
/*显然,如果您想让JavaScript正常工作,就必须启用它*/
browser.getSettings().setJavaScriptEnabled(true);
/*注册一个名为HTMLOUT的新JavaScript接口*/
addJavascriptInterface(新的MyJavaScriptInterface(),“HTMLOUT”);
/*在调用loadUrl之前必须设置WebViewClient*/
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url)
{
/*这个调用将JavaScript注入到刚刚完成加载的页面中*/
browser.loadUrl(“javascript:window.HTMLOUT.processHTML(“”+document.getElementsByTagName('html')[0]。innerHTML+“”);”;
}
});
/*加载网页*/
browser.loadUrl(“http://lexandera.com/files/jsexamples/gethtml.html");
您将在processHTML方法中获得整个Html contnet。
而且它不会对网页提出另一个请求。所以这也是一种更有效的方法
谢谢。您可以通过JavaScriptInterface从webview传递数据。。我已经做到了。
将数据保存到一个静态变量,然后在android application下处理您可以拦截WebView发出的HTTP请求,然后修改HTML以包含与HTML页面通信所需的任何JavaScript函数。您可以通过WebViewClient shouldInterceptRequest()方法拦截HTTP请求 使用此机制,您可以通过自己加载来访问加载的页面,在将其传递到WebView之前对其进行修改,甚至可以根据需要在本地缓存它。
WebView.evaluateJavascript(((function(){return window.document.body.outerHTML})();“,
webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String html) {
}
});
新的ValueCallback(){
@凌驾
公共void onReceiveValue(字符串html){
}
});
将此添加到您的代码中:
private String getUrlSource(String site) throws IOException {
//GNU Public, from ZunoZap Web Browser
URL url = new URL(site);
URLConnection urlc = url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
urlc.getInputStream(), "UTF-8"));
String inputLine;
StringBuilder a = new StringBuilder();
while ((inputLine = in.readLine()) != null)
a.append(inputLine);
in.close();
return a.toString();
}
那么,让我们来告诉你,要获得谷歌的资源,你应该做什么:
getURLSource("http://google.com");
谢谢,你的建议肯定比我目前发现的要好,但是。。。。对已经加载到WebView的页面进行HttpRequest将使带宽需求增加一倍(每个浏览的页面加载两次)。有更好的解决方案吗?您可以打一个电话,进行HttpRequest以获取数据,然后使用WebView.LoadData将其推送到WebView中。如果特定页面位于登录凭据之后,该怎么办?使用HttpRequest获取数据可能不是您希望获得的全部数据。可能只有在客户端呈现页面后才会加载页面的某些部分。这是从webview获取已经呈现并获取部分页面的页面的优势。使用上述方法,您可以仅获取已渲染的可见部分的所有数据,并且可能仍有未加载的数据,因为您尚未看到它。您只需使用Rest请求,使用所需的URL执行.get即可。可能的外观重复类似于。该教程最后还有一个警告。@shridutt kothari如果加载的内容不是HTML格式的,即XML或其他格式的,那么现在javascriptinterface没有被调用,并且最终将以TypeError结束。尝试理解回答中的代码,您也会找到获取其他类型内容的方法。谢谢。@shridutt kothari下次请相信你的消息来源。很明显,你从Bernd S指出的链接中复制并粘贴了你的答案(这本身并不是一件坏事)。在值得表扬的地方给予表扬,让OP自己判断解决方案,这很好。你不需要将其保存到静态变量中,否则,这种方法当然是正确的——就像上面kothari已经展示过的那样。不应该因为下载ZunoZap浏览器而崩溃