2010-08-13 4 views
24

Я хотел бы предварительно получить код HTML веб-страницы, который должен быть загружен в webView, проанализировать его с помощью регулярного выражения и отобразить только код HTML, который я хочу, в то время как позволяя веб-странице по-прежнему думать, что она загрузила все.Возможно ли получить код HTML из WebView

Есть ли способ сделать это в WebViewClient.onLoadResource() или аналогичные методы?

EDIT: Я попытался это:

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

Интерфейс никогда не называется

ответ

10

Пришлось использовать HttpClient. не требуется никакое печенья, просто разбор для 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, обработчик); Что такое клиент? –

+0

nevermind, Клиент HttpClient = новый DefaultHttpClient(); –

+0

@Aymon Fournier- Как получить только некоторую строку html-исходного кода веб-страницы? если я получу полную страницу источника, у меня может получиться так много времени, и мне не нужно получать всю линию, вы можете мне помочь? thx очень –

5

Вот учебник Extracting HTML from a WebView не забудьте прочитать предупреждение в конце урока.

+0

Этот код не работает –

+1

webview.addJavascriptInterface (новый MyJavaScriptInterface(), "HTMLOUT"); \t \t WebViewClient anchorWebViewClient = новый WebViewClient() \t { \t \t \t @Override \t \t \t общественность недействительной (вид WebView, String URL) onPageFinished \t \t \t { \t \t \t/* Этот вызов инъекционного JavaScript в страница, которая только что закончила загрузку. */ \t \t \t webview.loadUrl ("JavaScript: window.HTMLOUT.showHTML (' '+ document.getElementsByTagName (' HTML") [0] .innerHTML +');"); –

+0

этот учебник сохранил мой прикладок более одного раза .... спасибо за его размещение –

0

Попробуйте добавить @JavascriptInterface до того публичного ничтожной showHTML (строка HTML, контекст Context)

0

В случае, если у вас есть возможность влиять на серверную часть, где вы получите на странице, вы можете попросить перенаправить на определенную страницу в случае ошибки. В вашем WebViewClient вы можете обнаружить это перенаправление и использовать его как сигнал ошибки.

Смежные вопросы