使用 TFHpple 获得第一级

Getting first level using 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 "element" 的第一层(抱歉,我不知道正确的术语)放在一个数组中。 所以我试图通过简单地将 /div 作为 searchWithXPathQuery 方法的 xPath 来做到这一点,但它根本找不到任何东西。

我的第二个解决方案是尝试使用这种路径://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);

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

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

您写道:

Getting first level using TFHpple

我假设你的意思是:没有得到所有后代?

结合您的其他需求,您可以按如下方式进行:

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

剖析这个:

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

注意 1:您给定的 XML 无效,它包含多个根元素。 XML 最多可以有一个根元素。

注意 2:如果您的要求是 首先通过@class 或空 @class 获取所有 div,然后仅获取那些 =38=],反转谓词:

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