Javascript 如何获得全部<;img src>;是否在iOS UIWebView中创建网页?
各位 我正在尝试在UIWebView中获取当前页面的所有图像URL 这是我的代码Javascript 如何获得全部<;img src>;是否在iOS UIWebView中创建网页?,javascript,iphone,ios,objective-c,uiwebview,Javascript,Iphone,Ios,Objective C,Uiwebview,各位 我正在尝试在UIWebView中获取当前页面的所有图像URL 这是我的代码 - (void)webViewDidFinishLoad:(UIWebView*)webView { NSString *firstImageUrl = [self.webView stringByEvaluatingJavaScriptFromString:@"var images = document.getElementsByTagName('img');images[0].src.toString(
- (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);
}
我不知道为什么。
请帮帮我
谢谢。您可以在加载的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);
}
NSString*yourHTMLSourceCodeString=[webView stringByEvaluatingJavaScriptFromString:@“document.body.innerHTML”];
n错误*错误=NULL;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“()+?”
选项:nsregularexpressioncase不敏感
错误:&错误];
NSArray*matches=[regex matchesInstalling:yourHTMLSourceCodeString
选项:0
范围:NSMakeRange(0,[yourHTMLSourceCodeString长度]);
NSLog(@“总匹配项%d”,[匹配项计数]);
用于(NSTextCheckingResult*匹配项中的匹配项){
NSString*img=[yourHTMLSourceCodeString substringWithRange:[match RangeAtinex:2]];
NSLog(@“img src%”,img);
}
这是一个非常基本的正则表达式,可以匹配标记中的任何内容。如果您的图像具有更多属性,如class或id,则需要更多详细信息。我不喜欢正则表达式,因此下面是我的答案 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);
})()
您会注意到我在这里返回了一个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);
Perrohunter指出了一个非常好的
NSRegularExpression
解决方案。如果不想枚举匹配数组,也可以使用基于块的方法:
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);
}];
NSError*error=NULL;
NSRegularExpression*regex=[NSRegularExpression regular expression with pattern:@“()+?”
选项:nsregularexpressioncase不敏感
错误:&错误];
[正则表达式枚举匹配安装:您的HTMLSourceCodeString
选项:0
范围:NSMakeRange(0,[yourHTMLSourceCodeString长度])
usingBlock:^(NSTextCheckingResult*结果,NSMatchingFlags标志,布尔*停止){
NSString*img=[yourHTMLSourceCodeString substringWithRange:[result RangeAtinex:2]];
NSLog(@“img src%”,img);
}];
我还更新了regex模式以处理以下问题:
- start
标记和img
属性之间可以有属性李>src
- 在
属性之后和src
之前可以有属性李> - 在<代码>中间IMG标签(新版字符> <代码> >捕获新行字符除外);李>
属性值可以用src
以及“
引用;以及”
和src
之间以及=
和后续值之间可以有空格=
我清楚地认识到,对于新手来说,阅读正则表达式模式是一件痛苦的事情,也许其他解决方案可能更有意义(Joris的JSON建议,使用扫描仪,等等)但是,如果您想使用正则表达式,上述模式可能会覆盖更多的
img
标记排列,并且EnumerateMatchesInstance
可能比MatchesInstance
在给定html中的效率稍高一些,您可以使用库。使用Swift 3
do {
let doc: Document = try SwiftSoup.parse(html)
let srcs: Elements = try doc.select("img[src]")
let srcsStringArray: [String?] = srcs.array().map { try? $0.attr("src").description }
// do something with srcsStringArray
} catch Exception.Error(_, let message) {
print(message)
} catch {
print("error")
}
对不起,我错过了,以前是晚餐match@user1928537很高兴听到这个消息:顺便说一句,如果你想发疯,你应该更加小心
img
标记,并使用像@“()+?”
这样的正则表达式,因为(a)你可以在startimg
标记和src
属性之间有属性;(b)您可以在<代码> SRC < /Cult>标签之后,在<代码> >代码>之前;(c)可以在<代码>中间IMG< /代码>标签中有换行符;(d)我认为<代码> Src < /Cord>属性值可以引用<代码> <代码>以及<代码> <代码>;等等。@Rob这是个很好的建议,Rob!我知道我的正则表达式需要更多的工作,我只是写了一个非常简单的:P@Rob你的正则表达式非常好。这就是我需要的。上次,你帮了我。非常感谢。对于那些不喜欢正则表达式解析html的人,请参考以下经典:谢谢。实际上,对于那些仍然喜欢正则表达式的人来说,这更重要。不喜欢正则表达式的人可能已经读过/体验过:)@JorisKluivers谢谢!你的代码运行得很好。因为我不擅长正则表达式,所以我很赞同你的建议。我不反对使用正则表达式,但与我测试过的任何类型的字符串解析相比,这种javascript方法的速度都非常快。谢谢!!这个正则表达式更有用。你太棒了。所以,我改变了“接受答案”。对不起,佩罗汉特。。。我需要学习正则表达式。
do {
let doc: Document = try SwiftSoup.parse(html)
let srcs: Elements = try doc.select("img[src]")
let srcsStringArray: [String?] = srcs.array().map { try? $0.attr("src").description }
// do something with srcsStringArray
} catch Exception.Error(_, let message) {
print(message)
} catch {
print("error")
}