Webview解析html源码
2015-08-23 21:33
387 查看
webview加载网页的时候,如何获取html的源码,可以通过js来实现。
1:设置webview,js。
webView = (WebView) findViewById(R.id.wv);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new InJavaScriptLocalObj(), "haha");
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl("http://m.baidu.com/");
2:在onpageFinish里面解析。通过js。
final class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("WebView", "onPageStarted");
super.onPageStarted(view, url, favicon);
}
public void onPageFinished(WebView view, String url) {
Log.d("WebView", "onPageFinished ");
view.loadUrl("javascript:window.haha.showSource(document.getElementsByTagName('head')[0].innerHTML);");
super.onPageFinished(view, url);
}
}
final class InJavaScriptLocalObj {
@JavascriptInterface
public void showSource(String html) {
Log.d("HTML", html);
handleCode(html);
}
}
这样,在showSource中就可以获取html源码中的<head></head>中的代码。这样,可以读取html中的一些信息,完成h5和native的一些信息的交互。
最后,直接解析xml文件就可以了,当然,Android为我们提供了解析的api,就不要java中的方法解析了。
public void handleCode(String html) {
InputStream is = new ByteArrayInputStream(html.getBytes());
//注意:这里如果使用下面这行代码,在2.3系统上有bug,会解析失败
// XmlPullParser parser = Xml.newPullParser();
try {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(is, "utf-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
//获取节点的名字
String s = parser.getName();
//命名空间+属性名
parser.getAttributeValue(null,"name");
// if ("meta".equals(parser.getName())) {
// log(parser.getAttributeValue(null, "name"));
// log(parser.getAttributeValue(null, "content"));
// }
break;
}
type = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意事项:在和js交互中,你可以在showSource中打log看到,这里的线程不是主线程,所以,你如果要在这里处理一些UI,必须要放在主线程中,不然,你会发现UI的代码就是执行了,但是没变化,程序也没有crash,这个是千万要切记的。
第二个,这个解析的不要用直接new,还是通过factory来实现吧,不然在2.3上有bug。
三:有一个jar,jsoup这个可以更快捷的完成源码的解析,可惜首先要放到子线程中,应该是把源码下载下来,这样的话还是不太好。不太建议使用,小题大作了。
来个MainActivity.java,里面包含了完整的代码。点我1
1:设置webview,js。
webView = (WebView) findViewById(R.id.wv);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new InJavaScriptLocalObj(), "haha");
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl("http://m.baidu.com/");
2:在onpageFinish里面解析。通过js。
final class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("WebView", "onPageStarted");
super.onPageStarted(view, url, favicon);
}
public void onPageFinished(WebView view, String url) {
Log.d("WebView", "onPageFinished ");
view.loadUrl("javascript:window.haha.showSource(document.getElementsByTagName('head')[0].innerHTML);");
super.onPageFinished(view, url);
}
}
final class InJavaScriptLocalObj {
@JavascriptInterface
public void showSource(String html) {
Log.d("HTML", html);
handleCode(html);
}
}
这样,在showSource中就可以获取html源码中的<head></head>中的代码。这样,可以读取html中的一些信息,完成h5和native的一些信息的交互。
最后,直接解析xml文件就可以了,当然,Android为我们提供了解析的api,就不要java中的方法解析了。
public void handleCode(String html) {
InputStream is = new ByteArrayInputStream(html.getBytes());
//注意:这里如果使用下面这行代码,在2.3系统上有bug,会解析失败
// XmlPullParser parser = Xml.newPullParser();
try {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(is, "utf-8");
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
//获取节点的名字
String s = parser.getName();
//命名空间+属性名
parser.getAttributeValue(null,"name");
// if ("meta".equals(parser.getName())) {
// log(parser.getAttributeValue(null, "name"));
// log(parser.getAttributeValue(null, "content"));
// }
break;
}
type = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意事项:在和js交互中,你可以在showSource中打log看到,这里的线程不是主线程,所以,你如果要在这里处理一些UI,必须要放在主线程中,不然,你会发现UI的代码就是执行了,但是没变化,程序也没有crash,这个是千万要切记的。
第二个,这个解析的不要用直接new,还是通过factory来实现吧,不然在2.3上有bug。
三:有一个jar,jsoup这个可以更快捷的完成源码的解析,可惜首先要放到子线程中,应该是把源码下载下来,这样的话还是不太好。不太建议使用,小题大作了。
来个MainActivity.java,里面包含了完整的代码。点我1
相关文章推荐
- android WebView组件使用总结
- 解决video标签在安卓webview下无法自动播放问题
- Android webview与js交换JSON对象数据示例
- android中WebView和javascript实现数据交互实例
- Android的webview支持HTML5的离线应用功能详细配置
- Android开发之WebView组件的使用解析
- Android中实现Webview顶部带进度条的方法
- Android中访问证书有问题的SSL网页的方法
- 基于Android中Webview使用自定义的javascript进行回调的问题详解
- Android使用WebView播放flash的方法
- android webview 中localStorage无效的解决方法
- Android使用原生组件WebView加载网页和数据的方法
- android webview 简单浏览器实现代码
- android 中 webview 怎么用 localStorage
- Android WebView 常见问题及处理方案
- Android中在WebView里实现Javascript调用Java类的方法
- Android中WebView图片实现自适应的方法
- Android实现WebView删除缓存的方法
- Android开发笔记之探秘WebView
- Unity3D游戏引擎实现在Android中打开WebView的实例