2010-08-13 38 views
24

Tôi muốn nhận mã HTML của trang web được tải trong một webView, phân tích cú pháp bằng cách sử dụng regex và chỉ hiển thị mã HTML mà tôi muốn, trong khi cho phép trang web vẫn cho rằng trang web đã tải mọi thứ.Có thể lấy mã HTML từ WebView

Có cách nào để thực hiện điều đó trong WebViewClient.onLoadResource() hoặc các phương pháp tương tự không?

EDIT: Tôi cố gắng này:

class MyJavaScriptInterface 
{ 
     @SuppressWarnings("unused") 
     public void showHTML(String html, Context context) 
     { 
      new AlertDialog.Builder(context) 
       .setTitle("HTML") 
       .setMessage(html) 
       .setPositiveButton(android.R.string.ok, null) 
      .setCancelable(false) 
      .create(); 
       pageHTML = html; 
     } 
} 

@Override 
    public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) { 
     mRom.setFileSize(getFileSize(mRom.getURLSuffix())); 
     webview.getSettings().setJavaScriptEnabled(true); 
     MyJavaScriptInterface interfaceA = new MyJavaScriptInterface(); 
     webview.addJavascriptInterface(interfaceA, "HTMLOUT"); 
     WebViewClient anchorWebViewClient = new WebViewClient() 
     { 
      @Override 
      public void onPageFinished(WebView view, String url) 
      { 
       /* This call inject JavaScript into the page which just finished loading. */ 
       webview.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');"); 
       Pattern pattern = Pattern.compile("<h2>Winning Sc.+</h2></div>(.+)<br>", Pattern.DOTALL); 
       Matcher matcher = pattern.matcher(pageHTML); 
       matcher.find(); 

Giao diện không bao giờ được gọi là

Trả lời

10

Đã phải sử dụng HttpClient. không có cookie cần thiết, chỉ cần phân tích cho html:

private String getDownloadButtonOnly(String url){ 
    HttpGet pageGet = new HttpGet(url); 

    ResponseHandler<String> handler = new ResponseHandler<String>() { 
     public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { 
      HttpEntity entity = response.getEntity(); 
      String html; 

      if (entity != null) { 
       html = EntityUtils.toString(entity); 
       return html; 
      } else { 
       return null; 
      } 
     } 
    }; 

    pageHTML = null; 
    try { 
     while (pageHTML==null){ 
      pageHTML = client.execute(pageGet, handler); 
     } 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     Pattern pattern = Pattern.compile("<h2>Direct Down.+?</h2>(</div>)*(.+?)<.+?>", Pattern.DOTALL); 
     Matcher matcher = pattern.matcher(pageHTML); 
     String displayHTML = null; 
     while(matcher.find()){ 
      displayHTML = matcher.group(); 
     } 

    return displayHTML; 
} 

    @Override 
    public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) { 
     mRom.setFileSize(getFileSize(mRom.getURLSuffix())); 
     webview.getSettings().setJavaScriptEnabled(true); 
     WebViewClient anchorWebViewClient = new WebViewClient() 
     { 

      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) { 
       super.onPageStarted(view, url, favicon); 
       String downloadButtonHTML = getDownloadButtonOnly(url); 
       if(downloadButtonHTML!=null && !url.equals(lastLoadedURL)){ 
        lastLoadedURL = url; 
        webview.loadDataWithBaseURL(url, downloadButtonHTML, null, "utf-8", url); 
       } 
      } 
+0

@pageHTML = client.execute (pageGet, handler); khách hàng là gì? –

+0

nevermind, HttpClient client = new DefaultHttpClient(); –

+0

@Aymon Fournier- Cách tôi nhận được một số dòng mã nguồn html của trang web? nếu tôi nhận được trang nguồn đầy đủ nó có thể nhận được rất nhiều thời gian và tôi không cần phải nhận được tất cả các dòng, bạn có thể giúp tôi? thx rất nhiều –

5

Đây là một hướng dẫn của Extracting HTML from a WebView đừng quên đọc những cảnh báo trong phần cuối của hướng dẫn.

+0

Mã đó không hoạt động –

+1

webview.addJavascriptInterface (new MyJavaScriptInterface(), "HTMLOUT"); \t \t WebViewClient anchorWebViewClient = WebViewClient mới() \t { \t \t \t @ Override \t \t \t public void (xem WebView, String url) onPageFinished \t \t \t { \t \t \t/* Cuộc gọi này tiêm JavaScript vào trang vừa tải xong. */ \t \t \t webview.loadUrl ("javascript: window.HTMLOUT.showHTML ('' + document.getElementsByTagName ('html') [0] .innerHTML + '');"); –

+0

hướng dẫn đó đã lưu mông của tôi nhiều hơn một lần .... cảm ơn vì đã đăng nó –

0

Cố gắng thêm @JavascriptInterface trước public void showHTML (String html, bối cảnh bối cảnh)

0

Trong trường hợp bạn có một cơ hội để ảnh hưởng đến một phần máy chủ mà bạn nhận được một trang từ, bạn có thể yêu cầu chuyển hướng đến một trang cụ thể trong trường hợp có lỗi. Trong WebViewClient của bạn, bạn có thể phát hiện chuyển hướng này và sử dụng nó một tín hiệu lỗi.

Các vấn đề liên quan