2011-03-10 4 views
35

현재 WebView에 표시된 모든 HTML 컨텐츠를 검색하려면 어떻게합니까? WebView에서 HTML 컨텐츠를 검색하는 방법 (문자열로)

나는 WebView.loadData()을 발견하지만 난 반대 동등한를 찾을 수 없습니다 (예를 들어 WebView.getData())

(내가 제어 할 수없는 웹 페이지에 대한 데이터를 검색에 관심이 있습니다 즉, I 해당 페이지에 Javascript 함수를 삽입 할 수 없으므로 WebView에서 Javascript 인터페이스를 호출합니다.

+0

가능 중복 된 [I는 웹 페이지를 얻는 방법 내용을 WebView에서?] (http://stackoverflow.com/questions/2376471/how-do-i-get-the-web-page-contents-from-a-webview) – Guru

답변

16

불행히도 이렇게하는 쉬운 방법은 없습니다.

당신은 당신의 웹보기와 동일한 페이지에 HttpRequest를을하고 응답을받을 수 How do I get the web page contents from a WebView?

를 참조하십시오.

+0

고마워, 당신이 제안하는 무엇입니까 확실히 지금까지 내가 찾은 것보다 낫다. ... HttpRequest를 PA로 만든다. ge가 이미 WebView에로드되면 대역폭 요구 사항이 두 배가됩니다 (모든 열어 본 페이지를 두 번로드). 더 나은 해결책이 있습니까? – JohnK

+2

한 번의 호출로 HttpRequest를 만들어 데이터를 가져와 WebView.LoadData를 사용하여 WebView에 넣을 수 있습니다. – brendan

+0

특정 페이지가 로그인 자격 증명 뒤에 있으면 어떻게됩니까? –

30

당신은이를 통해 얻을 수 있습니다

final Context myApp = this; 

/* An instance of this class will be registered as a JavaScript interface */ 
class MyJavaScriptInterface 
{ 
    @SuppressWarnings("unused") 
    public void processHTML(String html) 
    { 
     // process the html as needed by the app 
    } 
} 

final WebView browser = (WebView)findViewById(R.id.browser); 
/* JavaScript must be enabled if you want it to work, obviously */ 
browser.getSettings().setJavaScriptEnabled(true); 

/* Register a new JavaScript interface called HTMLOUT */ 
browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 

/* WebViewClient must be set BEFORE calling loadUrl! */ 
browser.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) 
    { 
     /* This call inject JavaScript into the page which just finished loading. */ 
     browser.loadUrl("javascript:window.HTMLOUT.processHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');"); 
    } 
}); 

/* load a web page */ 
browser.loadUrl("http://lexandera.com/files/jsexamples/gethtml.html"); 

당신은 processHTML 방법의 전체 html로의 contnet을 얻을 것이다. 그리고 웹 페이지에 대한 다른 요청을하지 않습니다. 그래서 이것을하기위한보다 효율적인 방법이기도합니다.

감사합니다.

+3

http : // lexandera와 유사합니다.co.kr/2009/01/-html-from-a-webview /에서 볼 수 있습니다. 그 튜토리얼은 또한 결국 경고를합니다. –

+1

@shridutt kothari http://stackoverflow.com/questions/28194699/webview-content-are-not-loaded-properly-if-it-is-xml – GOLDEE

+1

로드되는 콘텐츠가 HTML 형식 즉 XML이 아닌 경우 또는 javascriptinterface가 호출되지 않고 TypeError – GOLDEE

0

webview에서 JavaScriptInterface를 통해 데이터를 전달할 수 있습니다.이 작업을 수행했습니다. 데이터를 정적 변수에 저장 한 다음 android applcation으로 처리합니다.

+0

정적 변수에 저장할 필요가 없습니다. 그렇지 않으면 위의 kothari에 이미 표시된 것처럼이 접근법은 물론 정확할 것입니다. –

1

WebView에서 생성 된 HTTP 요청을 가로 채고 HTML 페이지와 통신하는 데 필요한 JavaScript 함수를 포함하도록 HTML을 수정할 수 있습니다. WebViewClient shouldInterceptRequest() 메서드를 통해 HTTP 요청을 차단합니다.

이 메커니즘을 사용하면로드 된 페이지를 직접로드하고 WebView로 전달하기 전에 수정할 수 있으며 원하는 경우 로컬로 캐시 할 수도 있습니다.

8
webView.evaluateJavascript("(function(){return window.document.body.outerHTML})();", 
     new ValueCallback<String>() { 
      @Override 
      public void onReceiveValue(String html) { 

      } 
     }); 
+0

은 매력처럼 작동합니다. –

0

코드에 이것을 추가

private String getUrlSource(String site) throws IOException { 
    //GNU Public, from ZunoZap Web Browser 
    URL url = new URL(site); 
    URLConnection urlc = url.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(
    urlc.getInputStream(), "UTF-8")); 
    String inputLine; 
    StringBuilder a = new StringBuilder(); 
    while ((inputLine = in.readLine()) != null) 
    a.append(inputLine); 
    in.close(); 

    return a.toString(); 
} 

는 당신이 할 것 구글의 소스를 얻기 위해 무엇을 말할 수 :

getURLSource("http://google.com"); 
+1

크래쉬 온 버퍼 리더. –

+0

거기서 작동하는 ZunoZap Browser를 다운 받아야합니다. –

관련 문제