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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top