2

熟悉 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 且标题为空白

谢谢你的阅读

4

2 回答 2

4

它不起作用,因为 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。

于 2009-05-05T12:07:35.167 回答
0

如果您只想解析 HTML,为什么不使用 NSXMLDocument 而不是 WebView。我相信它的 initWithContentsOfURL 初始化程序会阻塞,直到加载 url。如果这不起作用,请尝试为 URL 创建一个 NSURLRequest,然后使用 [NSURLConnection sendSynchronousRequest:..] 加载它,然后将其提供给 NSXMLDocument。

于 2012-08-25T22:39:56.397 回答