1

Google API (非推奨) を使用せずに TFHpple を使用して Google ショッピングの結果を解析する方法はあります か?

私は多くの種類のタグを試しました:

...
myCar = @"Audi R8";
myURL = [NSString stringWithFormat:@"https://www.google.com/search?hl=en&tbm=shop&q=%@",myCar];
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];
TFHpple *xpath = [[TFHpple alloc] initWithHTMLData:htmlData];
//use xpath to search element
NSArray *elements = [NSArray new];
elements = [xpath searchWithXPathQuery:@"//html//body"]; // <-- tags
...

常に同じ出力コンソール メッセージ: UNABLE TO PARSE.

4

2 に答える 2

3

さまざまな問題を発見し、最終的にすべて解決しました。まず、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];
});
于 2013-07-25T09:47:00.307 に答える