如何在iOS UIWebView中获取网页的所有<img rel="nofollow noreferrer" src>?

tsk*_*tsk 5 javascript iphone objective-c uiwebview ios

大家.

我正在尝试在UIWebView中获取当前页面的所有图像URL.

所以,这是我的代码.

- (void)webViewDidFinishLoad:(UIWebView*)webView {
    NSString *firstImageUrl = [self.webView stringByEvaluatingJavaScriptFromString:@"var images = document.getElementsByTagName('img');images[0].src.toString();"];
    NSString *imageUrls = [self.webView stringByEvaluatingJavaScriptFromString:@"var images= document.getElementsByTagName('img');var imageUrls = "";for(var i = 0; i < images.length; i++){var image = images[i];imageUrls += image.src;imageUrls += \\’,\\’;}imageUrls.toString();"];
    NSLog(@"firstUrl : %@", firstImageUrl);
    NSLog(@"images : %@",imageUrls);
}
Run Code Online (Sandbox Code Playgroud)

第一个NSLog返回正确的图像的src,但第二个NSLog没有返回任何内容.

2013-01-25 00:51:23.253 WebDemo[3416:907] firstUrl: https://www.paypalobjects.com/en_US/i/scr/pixel.gif
2013-01-25 00:51:23.254 WebDemo[3416:907] images :
Run Code Online (Sandbox Code Playgroud)

我不知道为什么.请帮我...

谢谢.

Rob*_*Rob 12

Perrohunter指出了一个NSRegularExpression很好的解决方案.如果您不想枚举匹配数组,也可以使用基于块的enumerateMatchesInString方法:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];

[regex enumerateMatchesInString:yourHTMLSourceCodeString
                        options:0
                          range:NSMakeRange(0, [yourHTMLSourceCodeString length])
                     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

                         NSString *img = [yourHTMLSourceCodeString substringWithRange:[result rangeAtIndex:2]];
                         NSLog(@"img src %@",img);
                     }];
Run Code Online (Sandbox Code Playgroud)

我还更新了正则表达式模式来处理以下问题:

  • 开始img标记和属性之间可以有src属性;
  • 属性之后src和之前可以有属性>;
  • img标签中间可以有换行符(.捕获除换行符之外的所有内容);
  • src属性值可以用被引用'以及"; 和
  • src=之间以及之间=和后续值之间可以有空格.

我自由地认识到阅读正则表达式模式对于没有经验的人来说是痛苦的,也许其他解决方案可能更有意义(Joris的JSON建议,使用扫描仪等).但是如果你想使用正则表达式,上面的模式可能会覆盖img标签的一些更多的排列,并且enumerateMatchesInString可能比这更有效matchesInString.


Jor*_*ers 11

我不喜欢正则表达式,所以这是没有它们的答案.

javascript缩进以澄清:

// javascript to execute:
(function() {
    var images=document.querySelectorAll("img");
    var imageUrls=[];
    [].forEach.call(images, function(el) {
        imageUrls[imageUrls.length] = el.src;
    }); 
    return JSON.stringify(imageUrls);
})()
Run Code Online (Sandbox Code Playgroud)

你会注意到我在这里返回一个JSON字符串.要在Objective-C中阅读本文:

NSString *imageURLString = [self.webview stringByEvaluatingJavaScriptFromString:@"(function() {var images=document.querySelectorAll(\"img\");var imageUrls=[];[].forEach.call(images, function(el) { imageUrls[imageUrls.length] = el.src;}); return JSON.stringify(imageUrls);})()"];

// parse json back into an array
NSError *jsonError = nil;
NSArray *urls = [NSJSONSerialization JSONObjectWithData:[imageURLString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&jsonError];

if (!urls) {
    NSLog(@"JSON error: %@", jsonError);
    return;
}

NSLog(@"Images : %@", urls);
Run Code Online (Sandbox Code Playgroud)


per*_*ter 6

您可以在加载的webview html源代码上运行正则表达式

NSString *yourHTMLSourceCodeString = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];

    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img src=\"(.*?)\">)+?"
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];

    NSArray *matches = [regex matchesInString:yourHTMLSourceCodeString
                                      options:0
                                        range:NSMakeRange(0, [yourHTMLSourceCodeString length])];

    NSLog(@"total matches %d",[matches count]);

    for (NSTextCheckingResult *match in matches) {
        NSString *img = [yourHTMLSourceCodeString substringWithRange:[match rangeAtIndex:2]] ;
        NSLog(@"img src %@",img);
    }
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的正则表达式,匹配标签内的任何内容,如果您的图像具有更多属性,如类或ID,则需要更多详细信息