0

我目前正在尝试自学如何在 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";

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

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

4

1 回答 1

1

尝试使用 XPath 表达式

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

这应该给所有包含非全空白文本的节点。

编辑

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

以下 XPath

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

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

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

于 2013-12-04T18:07:11.513 回答