Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在iPhone中使用HTML解析(hpple)从div标记获取数据_Iphone_Objective C_Ipad_Hpple - Fatal编程技术网

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

无法在iPhone中使用HTML解析(hpple)从div标记获取数据,iphone,objective-c,ipad,hpple,Iphone,Objective C,Ipad,Hpple,我正在尝试使用hpple解析以下链接: 代码: -(void)parseURL:(NSURL*)url{ NSData*htmlData=[NSData DATA with contentsofURL:url]; TFHpple*xpathParser=[[TFHpple alloc]initWithHTMLData:htmlData]; NSArray*元素=[xpathParser searchWithXPathQuery:@”“; NSLog(@“元素%@”,元素); TFHppleEl

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

代码:

-(void)parseURL:(NSURL*)url{
NSData*htmlData=[NSData DATA with contentsofURL:url];
TFHpple*xpathParser=[[TFHpple alloc]initWithHTMLData:htmlData];
NSArray*元素=[xpathParser searchWithXPathQuery:@”“;
NSLog(@“元素%@”,元素);
TFHppleElement*元素=[elements objectAtIndex:0];
NSString*myTitle=[元素内容];
[xpathParser发布];
}
但它正在崩溃。事故报告:

XPath error : Invalid expression
<div class="body" id="article-529748-body">
^
XPath error : Invalid expression
<div class="body" id="article-529748-body">
^
XPath错误:表达式无效
^
XPath错误:表达式无效
^

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

检查元素数组是否为空

- (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];
}
-(void)parseURL:(NSURL*)url{
NSData*htmlData=[NSData DATA with contentsofURL:url];
TFHpple*xpathParser=[[TFHpple alloc]initWithHTMLData:htmlData];
NSArray*元素=[xpathParser searchWithXPathQuery:@”“;
NSLog(@“元素%@”,元素);
如果([元素计数]){
TFHppleElement*元素=[elements objectAtIndex:0];
}
NSString*myTitle=[元素内容];
[xpathParser发布];
}
尝试更改此选项:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];
写这篇文章(2年后!)以防对其他有类似问题的人有用

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

  • 使用类似于JamMySon在此页面上引用的语法(不需要转义单引号)
  • 请记住,[element content]只提供该节点的内容(如果有),而不是其子节点的内容
  • 因此,您可能需要使用递归遍历div的节点树

    代码(ARC):

    使用此递归方法:

    - (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倾析[10148:a0b]myTitle:(空)

    2014-10-22 19:44:07.997倾析[10148:a0b]正文:

    在访问英格兰东北部的一家医院时,卡梅伦先生将呼吁饮料行业采取更多措施来解决这一问题 国家医疗服务每年花费27亿英镑。禁止出售 低于成本价的酒精——低于为此支付的税款——将被取消 4月6日在英格兰和威尔士引入,但部长 预计将推动提高饮料的最低价格 最低单价说这是不公平的,因为它惩罚了所有的饮酒者, 不仅仅是狂饮或问题酒客。回应首相的建议 葡萄酒和烈酒贸易协会发言人加文·帕丁顿评论 重申饮料行业“帮助政府”的承诺 与其他利益相关者一起解决酒精滥用问题 正在努力通过公共卫生责任协议 促进负责任饮酒的一系列举措 帕丁顿说,这些举措包括扩大社区范围 英国各地的酒类伙伴关系和 零售商将提高消费者对葡萄酒单位的认识 帕丁顿说,与这些措施不同,最低单位 定价是一个迟钝的工具,两者都无法解决问题 滥用酒精并惩罚绝大多数应负责任的人 消费者。正如政府部长们承认的那样,它也可能是 “非法”。Decanter也反对该方案,称之为 “根本上有缺陷。”“真正的问题,”编辑盖伊·伍德沃德(Guy Woodward)说 他说,“与那些以葡萄酒为赔本货的超市发生了关系,他们大刀阔斧 利润率,欺负供应商和拉低价格,以便 吸引顾客……亏本出售葡萄酒既无助于消费者,也无助于消费者 该计划的其他反对者包括英国啤酒和啤酒 酒吧协会(PubAssociation)对BBC说,这是一种危险 通过提高税收来实现,这将极大地损害我们的利益 酒吧客、社区酒吧和酿酒商,花费了数千美元 人们认为,任何朝着最低价格迈进的举措都可能是错误的 根据欧洲竞争法,这是非法的,其目的是推动 为消费者提供价格,并允许企业在自由市场中运营 市场


    PS.在阅读了上述内容后,才在下午开始玩Hpple;我相信更有经验的人会想出一个更优雅的解决方案

    @Dee尝试使用相同的代码解析类似“”的简单HTML文件。如果您可以解析它,那么问题将出现在hpple上。与XML不同的是,HTML并不像XML那么容易解析,这是RayWenderlich关于如何在iOS上解析HTML的教程中所做的。我还知道,当你忘记在字符串前面加上@时,Obj-C有时会跳转。
    NSArray *elements  = [xpathParser searchWithXPathQuery:@"//div [@class='body'] [@id=\'article-529748-body\']"];
    
    - (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;
    }