是否可以从 WebView 获取 HTML 代码

新手上路,请多包涵

我想抢先获取要加载到 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();

接口永远不会被调用

原文由 Aymon Fournier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 373
2 个回答

不得不使用 HttpClient。不需要 cookie,只需解析 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);
                }
            }

原文由 Aymon Fournier 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题