1

使用 Webview,我想在此页面内找到链接。

-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
    DOMDocument *myDOMDocument = [[self.webview mainFrame] DOMDocument];

看起来是一个很好的起点,但我发现 WebScriptObject 类参考有点神秘。显然我不想评估一些 Javascript 来获取链接。我想直接读取 DOM。

如何找到 DOM 中的哪些节点是链接,并获取它们指向的地址?

4

3 回答 3

2

查找图像的 DOMNode

见 walkNodeTree @ http://cocoadev.com/wiki/DOMCore

-- 完成示例以查找图像节点、获取它们的 src 并制作 nsimages

@implementation DDAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self.webview.mainFrame loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://dominik.pich.info/Home.html"]]];
}

-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
    DOMDocument *myDOMDocument = [[self.webview mainFrame] DOMDocument];

    NSMutableArray *imgs = [NSMutableArray array];
    [self walkNodeTree:myDOMDocument imgsCollected:imgs];

    //bad code, demo
    NSMutableArray *nsImages = [NSMutableArray array];
    for (DOMNode *img in imgs) {
        for(int i = 0; i < img.attributes.length; i++) {
            DOMNode *attr = [img.attributes item:i];
            NSLog(@"%@", attr.nodeName);
            if([attr.nodeName.lowercaseString isEqualToString:@"src"]) {
                NSString *urlstring = [attr nodeValue];
                NSURL *url = [NSURL URLWithString:urlstring relativeToURL:[NSURL URLWithString:@"http://dominik.pich.info/"]];
                NSImage *nsimg = [[NSImage alloc] initWithContentsOfURL:url];
                if(nsimg)
                    [nsImages addObject:nsimg];
            }
        }
    }

    NSLog(@"%@", nsImages);
}

- (void)walkNodeTree:(DOMNode*)parent imgsCollected:(NSMutableArray*)imgs {
    DOMNodeList *nodeList = [parent childNodes];
    unsigned i, length = [nodeList length];
    for (i = 0; i < length; i++) {
        DOMNode *node = [nodeList item:i];

        NSLog(@"%@", node.nodeName);
        if([node.nodeName.lowercaseString isEqualToString:@"img"]) {
            [imgs addObject:node];
        }
        else {
            //recurse
            [self walkNodeTree:node imgsCollected:imgs];
        }
    }
}
@end
于 2012-11-20T10:50:50.467 回答
1

我一直在使用 xpath规范 XPath 介绍

通过将 HTML 从 URL 传递到NSXMLDocument,然后使用NSXMLNode 的 nodesForXPath:error 获取我想要的值:

在这种情况下,我使用大型机的 URL。但是任何有效的 URL 都应该没问题。

两个 NSXML 类似乎都可以像解析 xml 一样解析 html

您可以搜索大量 xpath 查询字符串语法示例,我发现一旦您知道 HTML 标记和类语法是什么,就很容易深入了解 DOM 树。

我在这里对整个页面使用了一个非常简单的 href查询。

但是我已经包含了一个注释掉的例子来显示更多。

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [theWebView setFrameLoadDelegate:self];

    NSURL* fileURL = [NSURL URLWithString:@"http://example.com"];

    NSURLRequest* request = [NSURLRequest requestWithURL:fileURL];
     [[theWebView mainFrame] loadRequest:request];
}

-(void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame {
    NSError *err_p = nil;

    NSXMLDocument * xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL   URLWithString:[theWebView mainFrameURL]]
                                                                  options:(NSXMLNodePreserveWhitespace|
                                                                           NSXMLNodePreserveCDATA)
                                                                    error:&err_p];

    if (xmlDoc == nil) {

        xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:[NSURL   URLWithString:[theWebView mainFrameURL]]
                                                      options:NSXMLDocumentTidyXML
                                                        error:&err_p];

    }

    NSError * error2;


      NSString *xpathQueryTRTest =@"//a";//--query string for all <a href tags
//--   for example 2 --NSString *xpathQueryTRTest =@"//div/p[1]";//--query string for all <a href tags
NSArray *newItemsNodesTRTEST = [xmlDoc nodesForXPath:xpathQueryTRTest error:&error2];//--xpath node results returned in an array

[xmlDoc release];

if (error2)
{
    [[NSAlert alertWithError:error2] runModal];
    return ;
}

for (NSXMLElement *node in newItemsNodesTRTEST)//--parse the nodes in the array
{

    NSLog(@"\nThe Node = %@\nThe node href value = %@", node, [[node attributeForName:@"href"]stringValue]);
    //--for example 2  --  NSLog(@"\nThe Node value = %@\n", [node stringValue]);
}
}
于 2013-10-20T23:06:59.307 回答
0

以上两个 答案都是 MAC 独有的,而不是 iOS 独有的。如果您偶然发现此页面正在寻找 iOS 解决方案,请查看教程,它基本上使用hpple库进行 DOM 节点遍历。其余的很简单。

于 2013-12-05T10:48:37.110 回答