Search code examples
androidandroid-webviewjsoup

Android - How to get plain HTML using evaluateJavascript from Webview? JSOUP not able to parse the result HTML


I am using below code to get HTML but i am not getting plain HTML, it contain non escapes character. I am using JSOUP parser which is not able to parse this HTML.

webview.evaluateJavascript(
                        "(function() { return ('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'); })();",
                        new ValueCallback<String>() {
                            @Override
                            public void onReceiveValue(String html) {
                            }
                        });

I am getting this html string from above code.

"\u003Chtml>\u003Chead>\n    \u003Cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    \u003Clink rel=\"shortcut icon\" href=\"https://www.xyx.com/favicon.ico\" type=\"image/x-icon\">\n    \u003Clink rel=\"icon\" href=\"https://www.xyx.com/favicon.ico\" type=\"image/x-icon\">\n    \n    \u003Ctitle>Page Not Found! : BJSBuzz\u003C/title>\n\n    \u003C!-- \n\tOpen Source Social Network (Ossn)/script>\u003C/body>\u003C/html>"

Solution

  • You should use JsonReader to parse the value:

    webView.evaluateJavascript("(function() {return document.getElementsByTagName('html')[0].outerHTML;})();", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(final String value) {
            JsonReader reader = new JsonReader(new StringReader(value));
            reader.setLenient(true);
            try {
                if(reader.peek() == JsonToken.STRING) {
                    String domStr = reader.nextString();
                    if(domStr != null) {
                        handleResponseSuccessByBody(domStr);
                    }
                }
            } catch (IOException e) {
                // handle exception
            } finally {
                IoUtil.close(reader);
            }
    }
    

    });