0

私は現在、iOSでスクラップをスクリーニングする方法を自分自身に教えようとしています.Androidでそうする方法を学びました.

私はhppleライブラリを使用しています。

現在、hpple を使用して Android にあるものを複製するのに苦労しているため、hpple を正しく使用して HTML コンテンツを解析する方法に関するガイダンスを探しています。

現在、HTML Web サイトから次のコンテンツを解析しようとしています。

<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 つしか見つけることができないため、「会社名」の値を取得できますが、他には何も取得できません。

誰でもクエリ文字列を手伝ってもらえますか?

4

1 に答える 1

1

XPath式を使用してみてください

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

これにより、すべてが空白ではないテキストを含むすべてのノードが表示されます。

編集

上記の解決策は、フォーマットさ<td>れたエントリをいくつかのノードに分割しますが、これはあなたが望むものではありません。したがって、実際には、粒度のレベルに関する限り、元の XPath が正しいアプローチのようです。

次の XPath

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

<td>つまり、テキスト自体またはすべての非空ノードになる少なくとも 1 つの子ノードを含むエントリのみが表示されます。

ただし、結果ノード セットはサブ構造を持つノードで構成されます。つまり、テキスト ノードとテキスト ノードを持つ子の両方が含まれます。これらの結果ノード セットを XPath と呼び出しルーチン (Objective C の場合) の間のインターフェイスとして使用するため、おそらくこのサブツリーからテキスト要素を自分で抽出して連結する必要があります。そのために使用できるライブラリルーチンがあるかもしれません。そうでない場合は、結果ノード ツリーを再帰的にトラバースすることでいつでも実行できます。

于 2013-12-04T18:07:11.513 に答える