iOS NSXMLParsing未成形的HTML

这是我的方法体parsing“IMG SRC”图像链接从一个RSS源生成的不良形成的HTML …我知道,NSXML只parsingXML,但我有这个希望,它可以绊倒通过混乱发现这些微不足道图像链接从杂乱的HTML。

我试图只检索在src属性中find的FIRST图像链接,我在每个元素名称中find名为IMG的nsData中有一个src属性,然后将其保存到另一个类的NSString * img中。 img标签不完全相同,例如nsData的一个实例只包含一个图像实例,就像其中的任何一个一样:

<img class =“ms-rteStyle-photoCredit”src =“www.imagelinkthatineed.com” 东西我不需要

<img alt =“”src =“www.imagelinkineedfortableimagecellpreview” 我不需要

<img class =“ms-rteStyle-photoCredit”src =“www.IneedThisLink.com” 更多我不需要的东西

似乎生成NSLog输出的唯一类是第一个。

我怎样才能得到parsing器方法实际运行?

考虑到有一种方法,是否有另一种更简单的方法推荐?

#import "HtmlParser.h" #import "ArticleItem.h" @implementation HtmlParser @synthesize elementArray; - (HtmlParser *) InitHtmlByString:(NSString *)string { // NSString *description = [NSString string]; NSData *nsData = [[NSData alloc] initWithContentsOfFile:(NSString *)string]; elementArray = [[NSMutableArray alloc] init]; parser = [[NSXMLParser alloc] initWithData:nsData]; parser.delegate = self; [parser parse]; 

如果我NSLog(@“%@”,nsData); 在这个方法体中,输出吐出原始的HTML。

 currentHTMLElement = [ArticleItem alloc]; return self; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"img src"]) { currentHTMLElement = [[ArticleItem alloc] init]; } NSLog(@"\t%@ found a %@ element", self, elementName); } - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (!currentHTMLElement) currentHTMLElement = [[NSMutableString alloc] initWithString:string]; NSLog(@"Processing Value: %@", currentHTMLElement); } - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"img src"]) { currentHTMLElement.img = elementName; [elementArray addObject:currentHTMLElement]; currentHTMLElement = nil; currentNodeContent = nil; } else { if (currentHTMLElement !=nil && elementName != nil && ([elementName isEqualToString:@"img src"])) { [currentHTMLElement setValue:currentHTMLElement forKey:elementName]; } } currentHTMLElement = nil; } @end 

谢谢你的想法。

鉴于HTML通常不是格式良好的XML, NSXMLParser可能无法正常工作。 如果你想parsingHTML,你可以参考这篇Ray Wenderlich文章, 如何在iOS上parsingHTML 。 如果你已经遵循了这些说明,并将Hpple添加到你的项目中,那么你可以像这样获取图像的src属性:

 #import "TFHpple.h" - (void)retrieveImageSourceTagsViaHpple:(NSURL *)url { NSData *data = [NSData dataWithContentsOfURL:url]; TFHpple *parser = [TFHpple hppleWithHTMLData:data]; NSString *xpathQueryString = @"//img"; NSArray *nodes = [parser searchWithXPathQuery:xpathQueryString]; for (TFHppleElement *element in nodes) { NSString *src = [element objectForKey:@"src"]; NSLog(@"img src: %@", src); } } 

另外,我说这支撑自己的抗NSRegularExpression响应的猛攻(在我的所有时间最喜欢的堆栈溢出答案的静脉),如果你想在HTML文件中的img标签列表,你可以使用以下几点正则expression式复杂:

 - (void)retrieveImageSourceTagsViaRegex:(NSURL *)url { NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSError *error = NULL; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<img\\s[\\s\\S]*?src\\s*?=\\s*?['\"](.*?)['\"][\\s\\S]*?>)+?" options:NSRegularExpressionCaseInsensitive error:&error]; [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { NSString *src = [string substringWithRange:[result rangeAtIndex:2]]; NSLog(@"img src: %@", src); }]; } 

如果你想使用NSXMLParser ,它将如下所示:

 - (void)retrieveImageSourceTagsViaNSXMLParser:(NSURL *)url { NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; parser.delegate = self; [parser parse]; } #pragma mark - NSXMLParserDelegate methods - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:@"img"]) { NSString *src = attributeDict[@"src"]; NSLog(@"img src: %@", src); } } 

问题是,根据我的经验, NSXMLParser在parsingHTML方面比LibXML2 / Hpple更不成功。 我发现在一些简单的页面上,上面的工作很好。 但在其他情况下,则不会。 底线,尽pipeNSXMLParser在parsing格式良好的XML方面非常出色,但我仍然谨慎使用它来parsingHTML。