133 votes

Lecture de contenu HTML depuis une UIWebView

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

Si ce n'est pas le cas, existe-t-il un autre moyen de récupérer du contenu HTML brut à partir d'une page Web dans le SDK de l'iPhone (par exemple, l'équivalent de .NET WebClient::openRead )?

Merci d'avance!

216voto

Tim Points 33042

La deuxième question est en fait plus facile de répondre. Regardez l' stringWithContentsOfURL:encoding:error: méthode de NSString - il vous permet de passer une URL comme une instance de NSURL (qui peut facilement être instancié à partir d'NSString) et retourne une chaîne de caractères avec le contenu complet de la page à l'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 l'exécution de ce code, googlePage contiendra le code HTML www.google.com et error contiendra toutes les erreurs rencontrées dans l'extraction. (Vous devriez vérifier le contenu de error après l'extraction.)

Dans l'autre sens (à partir d'une UIWebView) est un peu plus compliqué, mais il est fondamentalement le même concept. Vous aurez à tirer sur la demande de la vue, puis faire le récupérer comme avant:

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

EDIT: ces Deux méthodes prennent un gain de performance, cependant, car ils ne se le demander deux fois. Vous pouvez contourner ce problème en le saisissant par le contenu d'un actuellement chargé UIWebView à l'aide de son stringByEvaluatingJavascriptFromString: méthode, comme tel:

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

Cela permettra de saisir le courant du contenu HTML de la vue à l'aide du Modèle d'Objet de Document, d'analyser le Javascript, puis le donner à vous comme un NSString* de HTML.

Une autre façon est de faire votre demande par programmation d'abord, puis de charger le UIWebView de ce que vous avez demandé. Disons que vous prenez le deuxième exemple ci-dessus, où vous avez NSString *page comme le résultat d'un appel d' stringWithContentsOfURL:encoding:error:. Vous pouvez ensuite pousser cette chaîne dans la vue web à l'aide de loadHTMLString:baseURL:, en supposant que vous avez également eu lieu sur la NSURL vous avez demandé:

[yourWebView loadHTMLString:page baseURL:requestURL];

Je ne suis pas sûr, toutefois, si cela va exécuter Javascript présents dans la page que vous chargez (le nom de la méthode, loadHTMLString, est quelque peu ambigu, et les documents ne sont pas en dire beaucoup à ce sujet).

Pour plus d'info:

92voto

Ben Gottlieb Points 59900

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

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

44voto

tuoxie007 Points 479

Pour obtenir toutes les données html brutes (avec &)

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

29voto

Pmatt Points 309

Notez que le NSString stringWithContentsOfURL fera rapport totalement différente d'une chaîne user-agent de la UIWebView faire la même demande. Donc, si votre serveur est user-agent conscient, et de l'envoi de retour html différent selon qui les demande, vous ne pouvez pas obtenir de bons résultats de cette façon.

Notez également que l' @"document.body.innerHTML" mentionné ci-dessus va afficher uniquement ce qui est dans la balise body. Si vous utilisez @"document.all[0].innerHTML" , vous obtiendrez à la fois la tête et le corps. Ce qui n'est pas encore le contenu complet de la UIWebView, car il n'obtiendrez pas la !doctype ou des balises html, mais il est beaucoup plus proche.

20voto

Agni Points 129

Lire:-

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

Modifier:-

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X