• Android: 在WebView中获取网页源码


    1. 使能javascript:

    1
    webView.getSettings().setJavaScriptEnabled(true);

    2. 编写本地接口

    1
    2
    3
    4
    5
    final class InJavaScriptLocalObj {
        public void showSource(String html) {
            Log.d("HTML", html);
        }
    }


    3. 向网页暴露本地接口

    1
    webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");


    4. 编写自己的WebViewClient,并在onPageFinished中提取网页源码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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.local_obj.showSource('<head>'+" +
                    "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
            super.onPageFinished(view, url);
        }
    }

    组合在一起的代码为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package com.hi.briancol.htmlsource;
     
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.util.Log;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
     
    public class HtmlSource extends Activity {
        private WebView webView;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            webView = (WebView)findViewById(R.id.webview);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
            webView.setWebViewClient(new MyWebViewClient());
            webView.loadUrl("http://www.cnblogs.com/hibraincol/");
        }
         
         
       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.local_obj.showSource('<head>'+" +
                        "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
                super.onPageFinished(view, url);
            }
        }
         
        final class InJavaScriptLocalObj {
            public void showSource(String html) {
                Log.d("HTML", html);
            }
        }
    }

    关键之处在于:

    view.loadUrl("javascript:window.local_obj.showSource('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");

    运行,可以看到在showSource(String html)中打印了网页源码。

  • 相关阅读:
    MapReduce原理
    用redis构建分布式锁
    Python中类的特殊变量
    Python之元类
    python之WSGI与Guincorn
    一种消息和任务队列——beanstalkd
    LRU 算法
    extern、static、restrict、volatile 关键字
    bigtable原理
    Go的微服务库kite
  • 原文地址:https://www.cnblogs.com/zhwl/p/3178191.html
Copyright © 2020-2023  润新知