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

上記の両方の 回答は、iOSではなくMAC専用です。このページでiOSソリューションを探している場合は、このチュートリアルを確認してください。基本的に、DOMノードトラバーサルにhppleライブラリが使用されます。残りはかなり簡単です。

于 2013-12-05T10:48:37.110 に答える