さまざまな問題を発見し、最終的にすべて解決しました。まず、URL をエンコードして追加する必要があります。
myURL = [myURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
次に、元の (および実際の) TFHPPLE コード (正確には XPathQuery.m) の内部で、nodeContent と Raw が NIL であるため、解析フェーズがクラッシュします。したがって、このクラッシュを解決するために変更しました
[resultForNode setObject:currentNodeContent forKey:@"nodeContent"];
with (両方の行に注意 [resultForNode...:
if (currentNodeContent != nil)
[resultForNode setObject:currentNodeContent forKey:@"nodeContent"];
と:
[resultForNode setObject:rawContent forKey:@"raw"];
と:
if (rawContent != nil)
[resultForNode setObject:rawContent forKey:@"raw"];
覚えておきたいのは、Google が使用する HTML コードがより難しいため、これらの xpathqueries を使用することにしたことです。
...
NSArray *elementsImages = [NSArray new];
NSArray *elementsPrices = [NSArray new];
elementsImages = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliimg\"]"];
elementsPrices = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliprice\"]"];
...
別の不都合は、さまざまな html ページを取得するために for または while サイクルを使用することにした場合です。
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];
サイクル中に initWithContenctsOfURL が何度も正しくページを取得できない (そしてデバッグ コンソールが有名な UNABLE TO PARSE を書き込む) ため、次のように変更することにしました。
// Send a synchronous request
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
{
// Parse data here
}
そして、このサイクルを待ちたくない場合は、同期 NSURLRequests によって作成されているため、親メソッドを呼び出してみてください (そして、ビューコントローラーはパーサーを待ってフリーズしません):
_dispatch_queue_t *queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async( _queue, // now i call my google shopping parser cycle
^{
[self GShoppingParser];
});