Webview解析html源码

本文介绍了在Android中使用WebView加载网页时如何获取HTML源码。通过设置WebView和JavaScript交互,可以实现源码获取。同时,文章提到了两种解析方法:一是使用Android提供的API,二是利用Jsoup库,但建议在使用Jsoup时考虑线程安全问题和额外的下载步骤。附带了一个MainActivity.java的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值