Accéder à DOM Webkit Objective C
-
03-07-2019 - |
Question
Une personne connaissant Webkit pourrait-elle expliquer ou indiquer dans la bonne direction pourquoi le code suivant ne fonctionne pas
Ce que j'essaie de faire, c'est de charger une page, de l’analyser via Webkit et d’imprimer simplement le titre.
Voici ce que j'ai:
#include <iostream>
#include <WebKit/WebKit.h>
using namespace std;
/*
Seek Help
*/
int main (int argc, char * const argv[]) {
NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
WebFrame * mainFrame;
WebView * view = [[WebView alloc] initWithFrame: NSMakeRect (0,0,640,480)];
mainFrame = [view mainFrame];
NSString * url = @"http://test.com";
[[view mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
NSString * data = @"<html><head><title>testing</title></head><body>tester</body></html>";
[[view mainFrame] loadHTMLString:data baseURL: nil];
// NSString * urlString = [[NSString alloc] initWithUTF8String:"<html><head><title>Hello World</title></head><body><p>My first Web page.</p></body></html>"];
//[[view mainFrame] loadHTMLString:urlString baseURL:nil];
NSString * outerHtml = [(DOMHTMLElement *)[[[view mainFrame] DOMDocument] documentElement] innerHTML];
cout << "Html: " << [outerHtml UTF8String] << endl;
NSString * title = [view mainFrameTitle];
cout << "title: " << [title UTF8String] << endl;
[autoreleasepool release];
return 0;
}
La sortie est en HTML et le titre est vide
Merci d'avoir lu
La solution
Cela ne fonctionne pas car WebKit se base sur RunLoop pour charger le contenu, même s'il ne s'agit que de contenu statique.
Vous devez ajouter une boucle d'exécution standard telle que:
while (!done) {
pool = [[NSAutoreleasePool alloc] init];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantPast]];
[pool release];
}
Et créez une classe personnalisée que vous définissez comme WebFrameLoadDelegate ( webView.frameLoadDelegate = thatObject
) et dans le - (void) webView: (WebView *) expéditeur didFinishLoadForFrame: (WebFrame *) ) frame
, vous devriez pouvoir accéder au DOM. De même, lorsque le chargement est terminé, définissez l'indicateur done
sur YES.
Autres conseils
Si vous souhaitez simplement analyser le code HTML, pourquoi ne pas utiliser un document NSXMLDocument au lieu d’une vue Web. Je crois que son initializer initWithContentsOfURL bloque jusqu'au chargement de l'URL. Et si cela ne fonctionne pas, essayez de créer un NSURLRequest pour l'URL, puis utilisez [NSURLConnection sendSynchronousRequest: ..] pour le charger, puis transférez-le à NSXMLDocument.