无法使用iPhone中的HTML解析(hpple)从div标签获取数据

时间:2012-02-17 18:49:59

标签: iphone objective-c ipad hpple

我正在尝试使用hpple解析以下链接:

http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech

代码:

- (void)parseURL:(NSURL *)url {
    NSData *htmlData = [NSData dataWithContentsOfURL:url];    
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
    NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];
    NSLog(@"elements %@",elements);
    TFHppleElement *element = [elements objectAtIndex:0];
    NSString *myTitle = [element content];
    [xpathParser release];
}

但它正在崩溃。崩溃报告:

XPath error : Invalid expression
<div class="body" id="article-529748-body">
^
XPath error : Invalid expression
<div class="body" id="article-529748-body">
^

如何解决这个问题?为什么我的元素数组是空的?我是以错误的方式解析的吗?我想获得该div标签中的信息。

3 个答案:

答案 0 :(得分:0)

检查您的元素数组是否为空

- (void)parseURL:(NSURL *)url {
NSData *htmlData = [NSData dataWithContentsOfURL:url];    
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];
NSLog(@"elements %@",elements);
if([elements count]){
    TFHppleElement *element = [elements objectAtIndex:0];
}
NSString *myTitle = [element content];
[xpathParser release];
}

答案 1 :(得分:0)

尝试更改此内容:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];

致:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"//div [@class='body'] [@id=\'article-529748-body\']"];

答案 2 :(得分:0)

写这个(2年后!),以防它对有类似问题的其他人有用。

为了解析div中的html,你需要

  1. 在此页面上使用语法类似(单引号不需要转义)到JamMySon引用的内容
  2. 请记住[元素内容]仅为您提供该节点的内容(如果有),而不是其子节点。
  3. 因此,您可能需要使用递归来遍历div的节点树。

    代码(ARC):

    - (void) decanterHpple{
        NSURL *url = [NSURL URLWithString:@"http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech"];
        NSData *htmlData = [NSData dataWithContentsOfURL:url];
    
        TFHpple *pageParser = [TFHpple hppleWithHTMLData:htmlData];
    
        NSString *queryString = @"//div[@id='article-529748-body']";//1.works with unescaped single-quotes(') AND 2.No need for class='' when using id=''
        NSArray *elements = [pageParser searchWithXPathQuery:queryString];
    
        //old code ~ slightly amended
        if([elements count]){
            TFHppleElement *element = [elements objectAtIndex:0];
            NSString *myTitle = [element content];
            NSLog(@"myTitle:%@",myTitle );
        }
        //new code
        NSString *theText = [self stringFromWalkThruNodes:elements];
        NSLog(@"theText:%@",theText );
    }
    

    使用这种递归方法:

    - (NSString*) stringFromWalkThruNodes:(NSArray*) nodes {
        static int level = 0;//level is only useful for keeping track of recursion when stepping through with a breakpoint
        level++;//put breakpoint here...
        NSString *text = @"";
        for (TFHppleElement *element in nodes){
            if (element.content) {
                text = [text stringByAppendingString:element.content];
            }
            if (element.children) {
                NSString *innerText = [self stringFromWalkThruNodes:element.children];
                text = [text stringByAppendingString:innerText];
            }
        }
        level--;
        return text;
    }
    

    这给出了输出:

      

    2014-10-22 19:44:07.996 Decanted [10148:a0b] myTitle:(null)

         

    2014-10-22 19:44:07.997 Decanted [10148:a0b] theText:

         

    在访问英格兰东北部的一家医院时,卡梅伦先生要求饮料行业采取更多措施来解决一个问题。   国家医疗服务每年花费27亿英镑。禁止出售   低于成本价的酒精 - 低于其支付的税 - 将被设定为   从4月6日开始在英格兰和威尔士引入,但部长们是   预计将推高饮料的最低价格。对手的一个   最低单价说这是不公平的,因为它惩罚所有饮酒者,   不只是狂欢或问题饮酒者。对总理的反应   评论,葡萄酒与精神贸易协会发言人Gavin Partington   重申饮料行业致力于帮助政府   与其他利益相关者一起解决酒精滥用问题。这就是为什么我们这样做   正在通过公共卫生责任协议努力工作   一系列促进负责任饮酒的倡议。'这些   帕廷顿说,倡议包括扩大社区   英国各地的酒精伙伴关系和全国性的运动   零售商提高消费者对酒精含量的认识   酒精饮料。帕丁顿说,'与这些措施不同,最低单位   定价是一个生硬的工具,既不能解决问题   酒精滥用和惩罚绝大多数责任人   消费者。正如政府部长所承认的那样,也可能是这样   非法'.Decanter也反对该计划,称之为   “根本上存在缺陷。”“真正的问题,”编辑Guy Woodward说道   他说,“超市使用葡萄酒作为亏本领袖,大刀阔斧   利润率,欺凌供应商和拖累价格以便   吸引顾客......亏本卖葡萄酒对消费者和消费者都没有帮助   这个计划的其他反对者包括英国啤酒和   酒吧协会告诉BBC,它有“危险”   通过提高税收来完成,这将是非常有害的   酒吧观众,社区酒吧和酿酒师,耗资数千人至关重要   jobs.'tt被认为可以采取任何最低价格的举措   根据欧洲竞争法,这是非法的,旨在推倒   消费者的价格,允许公司免费经营   市场。

    PS。本周才开始和Hpple一起玩。在阅读上述Wenderlich tutorial之后;我相信更有经验的人可能会想出一个更优雅的解决方案!