【问题标题】:Is it possible to get the HTML code from WebView是否可以从 WebView 获取 HTML 代码
【发布时间】:2011-03-29 15:12:36
【问题描述】:

我想抢先获取webView中要加载的网页的HTML代码,使用正则表达式解析它,只显示我想要的HTML代码,同时让网页仍然认为它已经加载一切。

WebViewClient.onLoadResource() 或类似方法中有没有办法做到这一点?

编辑:我试过这个:

class MyJavaScriptInterface  
 {  
      @SuppressWarnings("unused")  
         public void showHTML(String html, Context context)  
         {  
            new AlertDialog.Builder(context)  
                 .setTitle("HTML")  
                 .setMessage(html)  
                 .setPositiveButton(android.R.string.ok, null)  
             .setCancelable(false)  
             .create();  
               pageHTML = html;
         }  
 }

@Override
    public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) {
        mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
        webview.getSettings().setJavaScriptEnabled(true);
        MyJavaScriptInterface interfaceA = new MyJavaScriptInterface();
        webview.addJavascriptInterface(interfaceA, "HTMLOUT");  
        WebViewClient anchorWebViewClient = new WebViewClient()
        {
            @Override  
            public void onPageFinished(WebView view, String url)  
            {  
                /* This call inject JavaScript into the page which just finished loading. */  
                webview.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
                Pattern pattern = Pattern.compile("<h2>Winning Sc.+</h2></div>(.+)<br>", Pattern.DOTALL);
                Matcher matcher = pattern.matcher(pageHTML);
                matcher.find();

接口永远不会被调用

【问题讨论】:

    标签: html android webview


    【解决方案1】:

    必须使用 HttpClient。不需要cookies,只需要解析html:

    private String getDownloadButtonOnly(String url){
        HttpGet pageGet = new HttpGet(url);
    
        ResponseHandler<String> handler = new ResponseHandler<String>() {
            public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                HttpEntity entity = response.getEntity();
                String html; 
    
                if (entity != null) {
                    html = EntityUtils.toString(entity);
                    return html;
                } else {
                    return null;
                }
            }
        };
    
        pageHTML = null;
        try {
            while (pageHTML==null){
                pageHTML = client.execute(pageGet, handler);
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
            Pattern pattern = Pattern.compile("<h2>Direct Down.+?</h2>(</div>)*(.+?)<.+?>", Pattern.DOTALL);
            Matcher matcher = pattern.matcher(pageHTML);
            String displayHTML = null;
            while(matcher.find()){
                displayHTML = matcher.group();
            }
    
        return displayHTML;
    }
    
        @Override
        public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) {
            mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
            webview.getSettings().setJavaScriptEnabled(true);
            WebViewClient anchorWebViewClient = new WebViewClient()
            {
    
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                    String downloadButtonHTML = getDownloadButtonOnly(url);
                    if(downloadButtonHTML!=null && !url.equals(lastLoadedURL)){
                        lastLoadedURL = url;
                        webview.loadDataWithBaseURL(url, downloadButtonHTML, null, "utf-8", url);
                    }
                }
    

    【讨论】:

    • @pageHTML = client.execute(pageGet, handler);什么是客户端?
    • 没关系,HttpClient 客户端 = new DefaultHttpClient();
    • @Aymon Fournier-我如何获得网页的一些 html 源代码?如果我得到完整的源页面,它可能会花很多时间,而且我不需要所有线路,你能帮我吗?非常感谢
    • 页面需要 JavaScript 获取数据时不起作用
    【解决方案2】:

    这里是Extracting HTML from a WebView的教程,不要忘记阅读教程末尾的警告。

    【讨论】:

    • webview.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); WebViewClient anchorWebViewClient = new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { /* 此调用将 JavaScript 注入刚刚完成加载的页面。 */ webview.loadUrl("javascript:window.HTMLOUT.showHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');");
    【解决方案3】:

    尝试在前面加上@JavascriptInterface public void showHTML(String html, Context context)

    【讨论】:

      【解决方案4】:

      如果您有机会影响接收页面的服务器部分,您可以要求重定向到特定页面以防出错。在您的 WebViewClient 中,您可以检测到此重定向并将其用作错误信号。

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 2020-12-16
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多