Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:提取HTML并处理它_Android - Fatal编程技术网

Android:提取HTML并处理它

Android:提取HTML并处理它,android,Android,我使用webview为一个我想从中获取信息但无法访问该网站(服务器端,仅客户端)的网站获取HTML 我能够通过javascript提取html。但当我运行代码时,我的数据字段不会更新,因为它在Javascript完成之前加载。我希望以后通过JSOUP处理数据。使用HTTPCLient很困难,因为它是一个具有登录名的网站,并且是SSL安全的。我可以通过WebView(手动登录)进入,然后再提取数据 有没有办法获取或通过登录,或者在第二个线程中等待,直到它加载了所有html数据 public cla

我使用webview为一个我想从中获取信息但无法访问该网站(服务器端,仅客户端)的网站获取HTML

我能够通过javascript提取html。但当我运行代码时,我的数据字段不会更新,因为它在Javascript完成之前加载。我希望以后通过JSOUP处理数据。使用HTTPCLient很困难,因为它是一个具有登录名的网站,并且是SSL安全的。我可以通过WebView(手动登录)进入,然后再提取数据

有没有办法获取或通过登录,或者在第二个线程中等待,直到它加载了所有html数据

public class MainActivity extends Activity implements OnClickListener {

TextView data;
Button getRost;
WebView webview;
String code;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    data = (TextView) findViewById(R.id.tvData);
    getRost = (Button) findViewById(R.id.btGet);
    getRost.setOnClickListener(this);
    webview = (WebView) findViewById(R.id.wvWeb);

}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    switch(arg0.getId())
    {
    case R.id.btGet:
        webview.getSettings().setJavaScriptEnabled(true);
        webview.addJavascriptInterface(new MyJavaScriptInterface(this), "HtmlViewer");
        webview.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                webview.loadUrl("javascript:window.HtmlViewer.showHTML" +
                        "('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
            }

        });

        webview.loadUrl("URLTHATCONTAINTSINFO");
        data.setText(code); 
    }   


}
class MyJavaScriptInterface {

    private Context ctx;

    MyJavaScriptInterface(Context ctx) {
        this.ctx = ctx;
    }

    public void showHTML(String html) {
        new AlertDialog.Builder(ctx).setTitle("HTML").setMessage(html)
        .setPositiveButton(android.R.string.ok, null).setCancelable(false).create().show();
        code = html;
    }

}

}
public类MainActivity扩展活动实现OnClickListener{
文本视图数据;
按钮getRost;
网络视图;
字符串代码;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
数据=(TextView)findViewById(R.id.tvData);
getRost=(按钮)findviewbyd(R.id.btGet);
getRost.setOnClickListener(这个);
webview=(webview)findViewById(R.id.wvWeb);
}
@凌驾
公共void onClick(视图arg0){
//TODO自动生成的方法存根
开关(arg0.getId())
{
案例R.id.btGet:
webview.getSettings().setJavaScriptEnabled(true);
addJavascriptInterface(新的MyJavaScriptInterface(this),“HtmlViewer”);
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
loadUrl(“javascript:window.HtmlViewer.showHTML”+
(“”+document.getElementsByTagName('html')[0].innerHTML+“”);”;
}
});
loadUrl(“包含信息的URL”);
data.setText(代码);
}   
}
类MyJavaScriptInterface{
私有上下文ctx;
MyJavaScriptInterface(上下文ctx){
this.ctx=ctx;
}
公共void showHTML(字符串html){
新建AlertDialog.Builder(ctx).setTitle(“HTML”).setMessage(HTML)
.setPositiveButton(android.R.string.ok,null).setCancelable(false).create().show();
代码=html;
}
}
}

如果站点使用的是自签名证书,您应该能够创建自己的SSL客户端,并且,如果您可以查看发送到站点以处理登录的内容,请通过POST发送

如果它使用的是完整的SSL证书,那么只需发布数据

无论哪种方式,都要让webview从那里处理结果

例如:

private void launchWeb() {
    webview = new WebView(this);

    // Where myWebview is the WebView object

    webview.setWebChromeClient(new WebChromeClient());
    webview.setWebViewClient(new MyWebViewClient());

    webview.clearCache(true);
    webview.clearHistory();
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

    webview.requestFocus(View.FOCUS_DOWN);

    String postData = "username=" + _username + "&password=" + _password;

    webview.postUrl("https://blahblah.com/somepath",
            EncodingUtils.getBytes(postData, "BASE64"));

}

好啊还有第二个问题,javascript注入比初始线程花费的时间更长。也许我误解了你在做什么。我还以为你是想对网站的结果做点什么,所以你想抓住代码。如果是这样的话:在您的webview中,您是否可以覆盖OnPageFinished并获取源代码?不,我需要使用webview获取的站点的源代码。我试着用Httpclient获取它,但这不起作用。我不能直接从客户端获取它,因为它在登录之后。也许我可以将两者结合起来,首先通过WebView发布,然后通过HttpConnection获取,但两者是否相互作用?是的,这就是我要说的。启动您的站点(我发布了代码)并使用您的webview处理登录。在webview中,重写OnPageFinish方法,以便在登录完成时通过回调通知您。然后您可以访问页面的源代码。您也将登录,并可以使用loadUrl更改页面。好的,我将检查tommorow它是否工作,我仍然想知道我是否使用Webview登录并设置了一个新的HTTPCLIENT它仍将登录?或者它恢复为未登录模式,因为我正在访问不同的地址。一个用于登录,一个用于查看数据。。。