使用TFHpple获得第一级

时间:2015-09-16 08:25:59

标签: html objective-c xpath tfhpple

我在使用TFHpple时遇到了一些麻烦,所以这里是: 我想解析以下几行:

<div class=\"head\" style=\"height: 69.89px; line-height: 69.89px;\">
    <div class=\"cell editable\" style=\"width: 135px;\"contenteditable=\"true\">
        <p>&nbsp;1</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>2</p>
    </div>
</div>

<div style=\"height: 69.89px; line-height: 69.89px;\" class=\"head\">
    <div class=\"cell\" style=\"width: 135px; text-align: left;\"contenteditable=\"false\">
        <p>3&nbsp;</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>4</p>
    </div>
</div>

<div style=\"height: 69.89px; line-height: 69.89px;\" class=\"\">
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>5</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>6</p>
    </div>
</div>

现在我想在数组中放置第一级div“元素”(抱歉,我不知道正确的术语)。 所以我尝试通过简单地将/div作为xPath添加到searchWithXPathQuery方法来实现,但它根本找不到任何内容。

我的第二个解决方案是尝试使用这种路径://div[@class=\"head\"]但也允许[@class=\"\"],但我甚至不知道是否可能。 (我想这样做,因为我需要元素在数组中的顺序与数据中的顺序相同)

所以这是我的问题,TFHpple无法与/div一起使用的特殊原因是什么? 如果现在只需要取div的第一级,那么是否可以使用xPath(这里是属性class)对属性的值进行谓词化? (怎么样?我现在看了很多,找不到任何东西)

感谢您的帮助。

PS:如果有帮助,这是我用来尝试解析数据的代码,它首先包含在字符串self.material.Text中:

NSData * data = [self.material.Text dataUsingEncoding:NSUnicodeStringEncoding];
TFHpple * tableParser = [TFHpple hppleWithHTMLData:data];
NSString * firstXPath = @"/div";
NSArray<TFHppleElement *> * tableHeader = [tableParser searchWithXPathQuery:firstXPath];
NSLog(@"We found : %d", tableHeader.count);

2 个答案:

答案 0 :(得分:0)

您可以使用以下XPath表达式来获取div 元素 - 这是一个非常正确的术语 - 类属性值等于"head"或为空:

//div[@ciass='head' or @class='']

答案 1 :(得分:0)

您写道:

  

使用TFHpple获得第一级

我认为你的意思是:没有得到所有的后代?

考虑到您的其他要求,您可以按照以下方式执行此操作:

//div[not(ancestor::div)][@class='head' or @class='']

解剖:

  • 在整个文档的任何级别选择所有div元素(是,正确的术语;)://div
  • 通过检查是否存在某个div祖先(父级的父级是......)[not(ancestor::div)]
  • 按您的其他要求过滤:[@class='head' or @class='']

注1:您的给定XML无效,它包含多个根元素。 XML最多只能包含一个根元素。

注2:如果你的要求是首先通过@class或空@class获取所有div,然后只获得那些“第一级”,则反转谓词:

//div[@class='head' or @class=''][not(ancestor::div)]