0

我花了大约 16 个小时研究和尝试不同的代码更改,但无法弄清楚这一点。我有一个使用 ASIHTTPrequest 使用网站的 iOS 应用程序:

-(void)refresh{
    NSURL *url = [NSURL URLWithString@"http://undignified.podbean.com/"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSString *response = [request responseString];
    NSLog(@"%@",response];
 }

上面的代码返回网站源代码并通过 NSLog 将其输出到控制台。我试图实现的目标是通过“responseString”搜索以 *.mp3 结尾的 URL,将它们加载到数组中,最后将 mp3 URL 加载到 UITableView 中。

总结一下:

  1. 使用 ASIHTTPRequest 消费网站数据
  2. 尝试在 responseString 中搜索具有 *.mp3 扩展名的所有链接并将它们加载到数组中。
  3. 将解析后的链接添加到 UITableView。

我想在这个路口我已经尝试了太多的事情来做出任何合理的判断。任何朝着正确方向提出的建议或推动都将不胜感激。

以下是响应 (HTML) 的示例。请注意,这只是一个片段,因为整个 HTML 源代码相当大,但这包括 mp3 文件的一部分:

a href="http://undignified.podbean.com/mf/web/ih2x8r/UndignifiedShow01.mp3"         target="new"><img src="http://www.podbean.com/wp-content/plugins/podpress/images/audio_mp3_button.png" border="0" align="top" class="podPress_imgicon" alt="icon for podbean" /></a> &nbsp;Standard Podcasts [00:40:24m]: <a href="javascript:void(null);" onclick="podPressShowHidePlayerDiv('podPressPlayerSpace_2649518', 'mp3Player_2649518_0', '300:30', 'http://undignified.podbean.com/mf/play/ih2x8r/UndignifiedShow01.mp3'); return false;"><span id="podPressPlayerSpace_2649518_label_mp3Player_2649518_0">Play Now</span></a> | <a href="javascript:void(null);" onclick="window.open ('http://undignified.podbean.com/wp-content/plugins/podpress/podpress_backend.php?podPressPlayerAutoPlay=yes&amp;standalone=yes&amp;action=showplayer&amp;pbid=0&amp;b=458211&amp;id=2649518&amp;filename=http://undignified.podbean.com/mf/play/ih2x8r/UndignifiedShow01.mp3', 'podPressPlayer', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,width=660,height=360'); return false;">Play in Popup</a> | <a href="http://www.podbean.com/podcast-download?b=458211&f=http://undignified.podbean.com/mf/web/ih2x8r/UndignifiedShow01.mp3" target="26108">Download</a> | <a href="http://www.podbean.com/podcast-players?b=458211&p=2649518&f=http://undignified.podbean.com/mf/play/ih2x8r/UndignifiedShow01.mp3" target="38148">Embeddable Player</a> | <a>Hits (214)</a><br/
4

3 回答 3

0

我真的不喜欢说“不要那样做”的答案。但是......不要那样做。

可以从您发布mp3地址中提取 html 中指向 s 的所有链接。但这几乎总是错误的处理方式,本案也不例外。

本质上,您似乎正在尝试做的是创建一个播客客户端。您应该考虑一下其他人以前如何处理此类用例。通常,播客将有一个关联的RSS提要,它准确地概述了您正在寻找的数据,您的播客也不例外。如果一个人只是导航到您的问题中提供的链接,然后在页面周围寻找“ subscribe to podcast”或“ RSS”,他们会找到指向RSS提要的链接:http://undignified.podbean.com/feed/. 该地址指向XML包含item播客的 s 的地址。

与您的原始地址返回的文档不同,此文档是有效的,XML这意味着它可以使用NSXMLParser. NSXMLParser非常强大和灵活。但是上手有点困难。这是一个NSXMLParser子类的一些示例代码,它充当它自己的委托。

UnDigParser.h

#import <Foundation/Foundation.h>
@interface UnDigParser : NSXMLParser <NSXMLParserDelegate>
@property (readonly) NSArray *links;
@end

UnDigParser.m

#import "UnDigParser.h"
@implementation UnDigParser{
    NSMutableArray *_links;
}
@synthesize links = _links;
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    _links = [[NSMutableArray alloc] init];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if ([elementName isEqualToString:@"enclosure"]){
        NSString *link = [attributeDict objectForKey:@"url"];
        if (link){
            [_links addObject:link];
        }
    }
}
-(BOOL)parse{
    self.delegate = self;
    return [super parse];
}
@end

可以像这样测试此代码:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSURL *url = [NSURL URLWithString:@"http://undignified.podbean.com/feed/"];
    // This is a sync call thus the background thread
    UnDigParser *parser = [[UnDigParser alloc] initWithContentsOfURL:url];
    [parser parse];
    NSLog(@"links:%@",parser.links);
});

记录的输出是:

links:(
    "http://undignified.podbean.com/mf/feed/cfdayc/UndignifiedShow03.mp3",
    "http://undignified.podbean.com/mf/feed/wbbpjw/UndignifiedShow02Final.mp3",
    "http://undignified.podbean.com/mf/feed/ih2x8r/UndignifiedShow01.mp3",
    "http://undignified.podbean.com/mf/feed/t4x54d/UndignifiedShow00.mp3"
)

这应该足以让你开始。

于 2012-04-10T03:46:00.530 回答
0

使用 requestDidReceiveResponseHeadersSelector 并从标题中获取文件名,尝试从 NSDictionary 标题中打印所有键和值。

于 2012-04-09T18:09:36.760 回答
0

我将分两步执行此操作:

  1. 获取所有 href 值

  2. 使用正则表达式检查以 .mp3 结尾的有效 url

顺便说一句,我认为 ASIHTTPRequest 已经过时了。如果你只用它来获取 HTML,我建议你查看 iOS 框架的内置方法来做到这一点。

于 2012-04-09T13:51:42.260 回答