gpt4 book ai didi

iphone - iOS NSXML 解析未格式化的 HTML

转载 作者:行者123 更新时间:2023-11-28 04:37:49 26 4
gpt4 key购买 nike

这是我的方法体,用于从 RSS 提要生成的格式不正确的 html 中解析“img src”图像链接...我知道 NSXML 仅解析 XML,但我希望它能从困惑中跌跌撞撞地从凌乱的 html 中找到这些微小的图像链接。

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

我不需要的东西

我不需要的东西

更多我不需要的东西

唯一似乎生成 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

谢谢你的想法。

最佳答案

鉴于 HTML 通常不是格式正确的 XML,NSXMLParser 可能无法工作。如果你想解析 HTML,你可以引用这篇 Ray Wenderlich 的文章,How to Parse HTML on iOS .如果您已按照这些说明进行操作并将 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);
}
}

或者,如果你想要一个 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。

关于iphone - iOS NSXML 解析未格式化的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com