web-dev-qa-db-fra.com

Lecture de contenu HTML à partir d'un UIWebView

Est-il possible de lire le contenu HTML brut d'une page Web chargée dans un fichier UIWebView?

Sinon, existe-t-il un autre moyen d'extraire du contenu HTML brut d'une page Web dans le SDK de l'iPhone (par exemple, un équivalent du fichier .NET WebClient::openRead)?

130

La deuxième question est en fait plus facile à répondre. Regarde le stringWithContentsOfURL:encoding:error: méthode de NSString - elle vous permet de passer une URL en tant qu’instance de NSURL (qui peut facilement être instanciée à partir de NSString) et renvoie une chaîne contenant le contenu complet de la page située à cette URL. Par exemple:

NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL 
                                                encoding:NSASCIIStringEncoding
                                                   error:&error];

Après avoir exécuté ce code, googlePage contiendra le code HTML de www.google.com et error contiendra toutes les erreurs rencontrées lors de l'extraction. (Vous devriez vérifier le contenu de error après l'extraction.)

Aller dans l'autre sens (à partir d'un UIWebView) est un peu plus compliqué, mais c'est fondamentalement le même concept. Vous devrez extraire la requête de la vue, puis effectuez l'extraction comme auparavant:

NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL 
                                          encoding:NSASCIIStringEncoding
                                             error:&error];

EDIT: Ces deux méthodes ont toutefois un impact négatif sur les performances car elles effectuent la demande deux fois. Vous pouvez contourner ce problème en récupérant le contenu d'un UIWebView actuellement chargé à l'aide de son stringByEvaluatingJavascriptFromString: méthode, en tant que telle:

NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString: 
                                         @"document.body.innerHTML"];

Cela récupérera le contenu HTML actuel de la vue à l'aide du modèle d'objet document, analysera le code JavaScript, puis vous le fournira sous la forme d'une chaîne NSString * HTML.

Une autre méthode consiste à traiter votre demande d'abord par programme, puis à charger UIWebView à partir de ce que vous avez demandé. Disons que vous prenez le deuxième exemple ci-dessus, où vous avez NSString *page à la suite d'un appel à stringWithContentsOfURL:encoding:error:. Vous pouvez ensuite envoyer cette chaîne dans la vue Web à l'aide de loadHTMLString:baseURL: _, en supposant que vous conserviez également le NSURL que vous avez demandé:

[yourWebView loadHTMLString:page baseURL:requestURL];

Cependant, je ne sais pas si cela permettra d'utiliser le code JavaScript trouvé dans la page que vous chargez (le nom de la méthode, loadHTMLString, est quelque peu ambigu, et la documentation n'en dit pas beaucoup à ce sujet).

Pour plus d'informations:

214
Tim

si vous souhaitez extraire le contenu d'un UIWebView déjà chargé, -stringByEvaluatingJavaScriptFromString. Par exemple:

NSString  *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
91
Ben Gottlieb

Pour obtenir toutes les données brutes HTML (avec <head> et <body>):

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
43
tuoxie007

Notez que la chaîne NSString stringWithContentsOfURL signalera une chaîne d'agent utilisateur totalement différente de celle de UIWebView faisant la même demande. Par conséquent, si votre serveur est conscient des agents utilisateurs et renvoie différents codes HTML en fonction de la personne qui le demande, vous risquez de ne pas obtenir des résultats corrects de cette façon.

Notez également que le @"document.body.innerHTML" mentionné ci-dessus n'affichera que le contenu de la balise body. Si tu utilises @"document.all[0].innerHTML" vous aurez à la fois la tête et le corps. Ce qui n’est pas encore le contenu complet de UIWebView, car il ne récupérera pas les balises! Doctype ou html, mais c’est beaucoup plus proche.

29
Pmatt

Lire:-

NSString *html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent"];
NSLog(html);    

Modifier:-

html = [myWebView stringByEvaluatingJavaScriptFromString: @"document.getElementById('your div id').textContent=''"];
19
Agni

Dans Swift v3:

let doc = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
2
Mc.Lover

vous devriez essayer ceci:

document.documentElement.outerHTML
1
schumyxp

J'utilise une extension Swift comme ceci:

extension UIWebView {
    var htmlContent:String? {
        return self.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML")
    }

}
1
Nathan

(Xcode 5 iOS 7) Exemple d'application universelle pour iOS 7 et Xcode 5. Il s'agit d'un projet/exemple open source situé ici: Lien vers SimpleWebView (Exemple de code source et de code de projet)

1
Matthew Ferguson

Un autre exemple

let content = uiWebView.stringByEvaluatingJavaScript(from: "document.body.innerHTML")

obtenez le code HTML de WKWebView
mettre HTML dans UIWebView
mettre HTML dans WKWebView

0
yoAlex5