解析Webview的HTML内容 - Android

时间:2014-12-24 20:48:13

标签: javascript android html webview

我想检测我的webview何时加载某个页面,例如,不正确的登录页面。我已尝试使用onLoadResourceshouldOverrideUrlLoading,但我无法工作,而且我认为更好的方法是在网络视图开始时解析HTML加载页面,如果在HTML中找到某个字符串,则执行任何操作。

有没有办法做到这一点?我尝试过使用TagSoup,但我不知道如何将它与我的webview联系起来。这是我的代码现在的样子:

String fullpost = "pass=" + passwordt + "&user=" + usernamet + "&uuid=" + UUID;

    String url = "mydomain.com";
        mWebview.postUrl(url, EncodingUtils.getBytes(fullpost, "BASE64"));
        mWebview.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView mWebview, String url) {
                String webUrl = mWebview.getUrl();
                    if (webUrl.contains("/loginf")) {
                        MainActivity.this.mWebview.stopLoading();
                        MainActivity.this.setContentView(R.layout.preweb);

                    }
              }
       });

基本上,postUrl是通过用户点击布局中的按钮启动的,这是启动WebView的原因,然后我将setContentView调用到包含webview的布局。

从那里,如果登录信息正确,则网页转到XXX,如果不正确,则转到YYY。所以,我想立即检测(并在每个页面上加载),如果加载了YYY,则//domagic。希望有道理。作为从url到XXX或YYY的页面重定向是自动的,不是由用户发起的,shouldOverrideUrlLoading不起作用,我无法弄清楚如何使用{{1我完全迷失了。

我当前的想法是将所有内容加载到一个单独的线程中,然后使用WebView显示内容(这样我可以解析HTML),但我不确定它是如何工作的,甚至不知道如何这样做。

任何人都有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

我想我已经阅读了一种获取webview内容文本字符串的方法。然后,您可以使用jsoup来解析它。 [neh,甚至不需要jsoup;只是indexOf字符串检查]

我建议您考虑使用HTTP客户端处理登录。它为您提供了灵活性,似乎是更合适的方式。我一直在使用loopj库来获取和发布请求。它允许更简单的代码。对我来说,无论如何,相对Android新手。这是我项目中的一些代码,可以帮助您思考。我遗漏了进度条和Cookie管理等内容。

private void loginFool() {
    String urlString = "http://www.example.com/login/";

    // username & password
    RequestParams params = new RequestParams();
    params.put("username", username.getText().toString());
    params.put("password", password.getText().toString());

    // send the request
    loopjClient.post(urlString, params, new TextHttpResponseHandler() {

        @Override
        public void onStart() {
            // called before request is started
            //System.err.println("Starting...");
        }

        @Override
        public void onSuccess(int statusCode, Header[] headers, String responseString) {
            // called when response HTTP status is "200 OK"

            // see if 'success' was a failed login...
            int idx = responseString.indexOf("Please try again!");
            if(idx > -1) {
                makeMyToast("Sorry, login failed!");
            }
            // or actual success-ful login
            else {

               // manage cookies here 

               // put extractData in separate thread 
                final String responseStr = responseString;
                new Thread(new Runnable() {
                    public void run(){

                        extractData(responseStr);
                        selectData(defaultPrefs.getInt("xyz_display_section", 0));

                        // start the next activity
                        Intent intent = new Intent(MainActivity.this, PageViewActivity.class);
                        startActivity(intent);
                        finish();

                    }
                }).start();

            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)

            makeMyToast("Whoops, network error!");
        }

        @Override
        public void onFinish() {
            // done
        }

    });
}

你可以看到,在响应处理程序的onSuccess回调中,我可以测试一个字符串,看看登录是否失败,并且在onFailure回调中,我给出了一个网络错误信息。

我没有足够的经验知道此类登录后登录的Web服务器百分比。

loopj客户端接收并管理cookie。如果您要通过webview访问网站的页面,则需要将loopj客户端的cookie复制到webview。我从一些在线帖子中拼凑了代码来做到这一点:

// get cookies from the generic http session, and copy them to the webview
CookieSyncManager.createInstance(getApplicationContext());
CookieManager.getInstance().removeAllCookie();
CookieManager cookieManager = CookieManager.getInstance();

List<Cookie> cookies = xyzCookieStore.getCookies();
for (Cookie eachCookie : cookies) {
    String cookieString = eachCookie.getName() + "=" + eachCookie.getValue();
    cookieManager.setCookie("http://www.example.com", cookieString);
    //System.err.println(">>>>> " + "cookie: " + cookieString);
}
CookieSyncManager.getInstance().sync();
// holy crap, it worked; I am automatically logged in, in the webview

编辑:而且,我应该包括类变量定义和初始化:

private AsyncHttpClient loopjClient = new AsyncHttpClient();
private PersistentCookieStore xyzCookieStore;

xyzCookieStore = new PersistentCookieStore(this);
loopjClient.setCookieStore(Utility.xyzCookieStore);