Доступ к DOM Webkit Цель C - PullRequest
2 голосов
/ 04 мая 2009

Может ли кто-нибудь, кто знаком с webkit, объяснить или указать мне правильное направление, почему следующий код не работает

То, что я пытаюсь сделать, это загрузить страницу, сделать так, чтобы webkit проанализировал ее и просто распечатал заголовок.

Вот что у меня есть:

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

Вывод html и заголовок не заполнены

Спасибо, что прочитали

Ответы [ 2 ]

4 голосов
/ 05 мая 2009

Это не работает, потому что WebKit использует RunLoop для загрузки контента, даже если это просто статический контент.

Вы должны добавить стандартный цикл выполнения, такой как:

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

И создайте пользовательский класс, который вы задали как WebFrameLoadDelegate (webView.frameLoadDelegate = thatObject), и в обратном вызове - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame вы сможете получить доступ к DOM. Также, когда загрузка будет завершена, установите флаг done в YES.

0 голосов
/ 26 августа 2012

Если вы просто хотите проанализировать HTML, почему бы не использовать NSXMLDocument вместо WebView. Я полагаю, что его инициализатор initWithContentsOfURL блокирует, пока URL не загружен. И если это не сработает, попробуйте создать NSURLRequest для URL, а затем используйте [NSURLConnection sendSynchronousRequest: ..], чтобы загрузить его, а затем передать его в NSXMLDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...