web-dev-qa-db-fra.com

Comment récupérer du contenu HTML à partir de WebView (sous forme de chaîne)

Comment récupérer tout le contenu HTML actuellement affiché dans une vue Web?

J'ai trouvé WebView.loadData() mais je n'ai pas trouvé l'équivalent inverse (par exemple WebView.getData ())

Veuillez noter que je suis intéressé par la récupération des données de pages Web sur lesquelles je n’ai aucun contrôle (c’est-à-dire que je ne peux pas injecter de fonction Javascript dans ces pages, de sorte qu’elle appelle une interface Javascript dans WebView).

36
JohnK

Malheureusement, il n’ya pas de moyen facile de le faire.

Voir Comment puis-je obtenir le contenu d'une page Web à partir d'une WebView?

Vous pouvez simplement créer une requête HttpRequest sur la même page que votre WebView et obtenir la réponse.

17
brendan

Vous pouvez y parvenir grâce à:

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

Vous obtiendrez l'intégralité du contenu HTML dans la méthode processHTML . c'est donc aussi un moyen plus efficace de le faire.

Merci.

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

          }
      });
10
noamtcohen

Vous pouvez intercepter les requêtes HTTP effectuées par WebView, puis modifier le code HTML pour inclure toutes les fonctions JavaScript nécessaires pour communiquer avec la page HTML. Vous interceptez les requêtes HTTP via la méthode WebViewClient shouldInterceptRequest ().

En utilisant ce mécanisme, vous pouvez accéder à la page chargée en la chargeant vous-même, en la modifiant avant de la transmettre à WebView et même en la mettant en cache localement si vous le souhaitez.

1
Jakob Jenkov

Ajoutez ceci à votre code:

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

puis, disons ce que vous feriez pour obtenir la source de Google:

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

vous pouvez transmettre des données via JavaScriptInterface à partir de la vue Web .. j'ai fait ceci . enregistrer les données dans une variable statique puis traiter sous Android

0
Ryan