繁体   English   中英

解析Webview的HTML内容-Android

[英]Parse HTML contents of Webview - Android

我想检测我的Web视图何时加载某个页面,例如不正确的登录页面。 我已经尝试过使用onLoadResourceshouldOverrideUrlLoading ,但是我都不能使用,并且我想一种更好的方法是在webview开始加载页面时,以及在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不起作用,而且我不知道如何使用onLoadResource ,所以我完全迷失了。

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

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

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

我建议您考虑使用HTTP客户端处理登录。 它为您提供了灵活性,并且似乎是更合适的方法。 我一直在使用loopj库进行HTTP获取和发布请求。 它允许使用更简单的代码。 无论如何,对我而言,是相对的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。 如果要通过Web视图从站点访问页面,则需要将cookie从loopj客户端复制到Web视图。 我从一些在线帖子中整理了代码,以实现以下目的:

// 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM