iOS的NSXMLParsing未成形的HTML(iOS NSXMLParsing unformed

2019-07-19 20:00发布

这是我的方法机构解析来自不良的HTML通过RSS源生成的“IMG SRC”图像链接...我知道,只有NSXML XML解析,但我有这个希望,它能够通过烂摊子跌跌撞撞找到这些微乎其微从凌乱的HTML图像链接。

我想只检索到src属性中我有一个src属性中的NSData称为IMG的每个元素名称查找发现的第一个图像链接,然后将其保存到的NSString * IMG另一个类。 在img标签都不尽相同,例如NSData的实例将只包含一个喜欢其中任何一个图像实例:

<IMG类= “MS-rteStyle-photoCredit” SRC = “www.imagelinkthatineed.com” 东西我不需要

<IMG ALT = “” SRC = “www.imagelinkineedfortableimagecellpreview” 东西我不需要

<IMG类= “MS-rteStyle-photoCredit” SRC = “www.IneedThisLink.com” 更多的东西,我不需要

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

我怎样才能获得解析器的方法来实际运行?

既然有办法,有没有给你推荐一个不同的,更简单的方法?

#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

谢谢你的想法。

Answer 1:

由于HTML通常不格式良好的XML, NSXMLParser可能无法正常工作。 如果你想解析HTML,你可能是指这个雷Wenderlich文章, 如何在iOS解析HTML 。 如果您已经按照这些说明并增加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反应(在我的静脉一直最喜欢的堆栈溢出的答案 ),如果你想要的清单img在HTML文件的标签,你可以使用有所以下复杂的正则表达式:

- (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是在解析HTML比的libxml2 / Hpple是不太成功的。 我发现,在一些简单的网页,上面的伟大工程。 但在其他情况下,它没有。 底线,尽管NSXMLParser是在解析格式良好的XML很大,我会小心使用它的HTML的解析。



文章来源: iOS NSXMLParsing unformed HTML