iOS解析内容需要hpple帮助

时间:2013-12-04 17:39:08

标签: ios xpath html-parsing hpple

我目前正在尝试自学如何在iOS上筛选废品,并在Android上学会了如何操作。

我正在使用hpple库。

我目前正在努力使用hpple复制我在Android上的内容,因此我正在寻找有关如何正确使用hpple来解析我的HTML内容的一些指导。

我目前正在尝试从我的HTML网站解析以下内容:

<table class="tableForAppContent">     

<tr>
<td nowrap="nowrap">
<a href='testLink'>CODE</a> MyTestCode</td>
<td nowrap>
<a href='testLink'>Number 123</a></td>
<td></td>
<td>Company Name</td>
<td nowrap>
11:10 AM
</td>
<td class="tableList" nowrap>
</td>
<td>
</td>
<td nowrap>
Status of company
<br />
</td>
<td>
</td>
</tr>

</table>

我需要能够获取HTML中所见的所有文本值,因此我需要能够获取值:“CODE MyTestCode”,“Number 123”,“Company Name”,“11:10 AM“和”“公司的地位”。

这是我到目前为止的代码:

NSURL *url = [NSURL URLWithString:@"MyTestSite.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval: 30.0]; // Will timeout after 30 seconds
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue currentQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

 if (data != nil && error == nil)
 {
     NSString *result = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
     TFHpple *tutorialsParser = [TFHpple hppleWithHTMLData:data encoding:@"NSASCIIStringEncoding"];
     NSString *tutorialsXpathQueryString = @"//table[@class='tableForContent']//td";
     NSArray *tutorialsNodes = [tutorialsParser searchWithXPathQuery:tutorialsXpathQueryString];

     NSMutableArray *newTutorials = [[NSMutableArray alloc] initWithCapacity:0];
     for (TFHppleElement *element in tutorialsNodes) {
           NSLog(@"%@", [[element firstChild] content]);

           }
      }
      else
      {
      // There was an error, alert the user
      }                    
}];

我无法找到以下代码行的正确XPath查询字符串

NSString *tutorialsXpathQueryString = @"//table[@class='tableForContent']//td";

无论我尝试什么,我一次只能找到一个元素,所以我可以获得“公司名称”值,但没有别的。

任何人都可以帮助查询字符串吗?

1 个答案:

答案 0 :(得分:1)

尝试使用XPath表达式

//table[@class='tableForContent']//*[normalize-space(text()) != '']

应该为包含非全部空白文本的所有节点提供。

修改

上面的解决方案将格式化的<td>条目拆分为多个节点,这不是您想要的。因此,事实上,就粒度级别而言,您的原始XPath似乎是正确的方法。

以下XPath

//table[@class='tableForAppContent']//td[* or normalize-space(text()) != '']

为您提供“正确的”<td>条目,也就是说,只包含那些包含文本本身的条目或至少一个应该导致所有非空节点的子节点。

但是,结果节点集由具有子结构的节点组成,这意味着它们包含文本节点和包含文本节点的子节点。由于您将这些结果节点集用作XPath和调用例程之间的接口(在Objective C?中),您可能必须自己从该子树中提取文本元素并将它们连接起来。也许有可用于此的库例程。如果没有,您可以通过递归遍历结果节点树来完成它。