Accesso a DOM Webkit Obiettivo C
-
03-07-2019 - |
Domanda
Qualcuno che abbia familiarità con il webkit può spiegare o indicarmi la giusta direzione sul perché il seguente codice non funziona
Quello che sto cercando di fare è caricare una pagina, farla analizzare da webkit e semplicemente stampare il titolo.
Ecco cosa ho:
#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;
}
L'output è sia html che il titolo sono vuoti
Grazie per aver letto
Soluzione
Non funziona perché WebKit si basa su RunLoop per caricare il contenuto, anche se si tratta solo di contenuto statico.
Devi aggiungere un ciclo di esecuzione standard come:
while (!done) {
pool = [[NSAutoreleasePool alloc] init];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantPast]];
[pool release];
}
E crea una classe personalizzata che imposti come WebFrameLoadDelegate ( webView.frameLoadDelegate = thatObject
) e nel - (void) webView: (WebView *) mittente didFinishLoadForFrame: (WebFrame * ) frame
dovresti essere in grado di accedere al DOM. Inoltre, al termine del caricamento, impostare il flag done
su YES.
Altri suggerimenti
Se vuoi solo analizzare l'HTML, perché non usare un NSXMLDocument invece di un WebView. Credo che l'inizializzatore initWithContentsOfURL blocchi fino a quando l'URL non viene caricato. E se non funziona, prova a creare un NSURLRequest per l'URL e quindi usa [NSURLConnection sendSynchronousRequest: ..] per caricarlo e quindi inviarlo a NSXMLDocument.