2011年9月6日

Android: 抓取Webview載入網頁的HTML碼

(出處)lexanderA » Extracting HTML from a WebView:

藉著setWebViewClient設定,當WebView載入網頁後onPageFinished,巧妙地插入JavaScript碼。利用JavaScript的document.getElementsByTagName傳出網頁的HTML原始碼,然後呼叫我們經由addJavascriptInterface掛上的showHTML函數,HTML碼就手到擒來了!

mWebView = (WebView) findViewById(R.id.webview);
WebSettings ws = mWebView.getSettings();
ws.setSavePassword(false);
ws.setSaveFormData(false);
ws.setJavaScriptEnabled(true);
ws.setSupportZoom(false);

mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"HTMLOUT");
mWebView.setWebViewClient(new WebViewClient(){ 
    @Override 
    public void onPageFinished(WebView view, String url)  { 
      mWebView.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+
     document.getElementsByTagName('html')[0].innerHTML+'</head>');"); 
   } 
}); 

底下就是用AlertDialog顯示網頁上的html碼。


final class DemoJavaScriptInterface {
   public void showHTML(String html) {
         new AlertDialog.Builder(AppCt).setTitle("HTML codes")
         .setMessage(html)
         .setPositiveButton(android.R.string.ok, null)
         .setCancelable(false).create().show();
   }
}

下面用來攔截Javascrip Alert 換成Android的。

final class MyWebChromeClient extends WebChromeClient {
  @Override
 public boolean onJsAlert(WebView vw,String url,String msg,JsResult ret){
     new AlertDialog.Builder(AppCt).setTitle("Alert").setMessage(msg)
        .setPositiveButton(android.R.string.ok, null)
        .setCancelable(false).create().show();
    ret.confirm();
    return true;
 }
}

2 則留言:

Unknown 提到...

請問小弟要是抓取網頁

body裡的內容

該如何做?

拜託您指點一下

Wsj 提到...

你需要剖析html字串,body就在其中。