您的位置:首页 > 移动开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview