Frage

Könnte jemand, der mit Webkit kennt bitte erklären oder mich in die richtige Richtung zeigen, warum der folgende Code funktioniert nicht

Was ich versuche zu tun ist, um eine Seite zu laden, hat sie webkit analysiert und einfach aus dem Titel drucken.

Hier ist, was ich habe:

#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;
}

Die Ausgabe ist sowohl HTML-und Titel sind leer

Danke für das Lesen

War es hilfreich?

Lösung

Es funktioniert nicht, weil WebKit auf der Runloop verlässt sich Inhalte zu laden, auch wenn es nur statische Inhalte.

Sie sollten eine Standardlaufschleife hinzufügen, wie:

while (!done) {
    pool = [[NSAutoreleasePool alloc] init];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                             beforeDate:[NSDate distantPast]];
    [pool release];
}

Und eine benutzerdefinierte Klasse erstellen, die Sie als WebFrameLoadDelegate (webView.frameLoadDelegate = thatObject) festgelegt und in dem - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame Rückruf sollten Sie in der Lage sein, das DOM zugreifen. Auch wenn die Last fertig gesetzt, um die done Flagge auf YES.

Andere Tipps

Wenn Sie nur die HTML analysieren wollen, warum nicht eine NSXMLDocument anstelle eines WebView verwenden. Ich glaube, seine initWithContentsOfURL initializer blockiert, bis die URL geladen wird. Und wenn das funktioniert nicht versucht, eine NSURLRequest für die URL erstellen und dann mit [NSURLConnection sendSynchronousRequest: ..]. Um es zu laden und dann füttern, das zu NSXMLDocument

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top