1

有没有办法使用 TFHpple 解析谷歌购物结果而不使用谷歌 API(已弃用),但使用 url 很简单,例如:https ://www.google.com/search?hl=en&tbm=shop&q=AudiR8 ?

我尝试了许多类型的标签:

...
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
...

但无事可做,总是相同的输出控制台消息:无法解析。

4

2 回答 2

3

我发现了各种问题,最后我解决了所有问题。首先,有必要对 URL 添加进行编码:

myURL = [myURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

然后,在原始(和实际)TFHPPLE 代码(恰好是 XPathQuery.m)内部,解析阶段会崩溃,因为任何时候 nodeContent 和 Raw 都是 NIL。所以,为了解决这个崩溃,我改变了

[resultForNode setObject:currentNodeContent forKey:@"nodeContent"];

与(注意两行[resultForNode ...:

if (currentNodeContent != nil)
   [resultForNode setObject:currentNodeContent forKey:@"nodeContent"];

和:

[resultForNode setObject:rawContent forKey:@"raw"];

和:

if (rawContent != nil)
      [resultForNode setObject:rawContent forKey:@"raw"];

我想记住这一点,因为谷歌使用的 html 代码更难,我决定使用这些 xpathqueries:

...
        NSArray *elementsImages = [NSArray new];
        NSArray *elementsPrices = [NSArray new];
        elementsImages = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliimg\"]"];
        elementsPrices = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliprice\"]"];
...

另一个不便之处是当您决定使用 for 或 while 循环来检索各种 html 页面时,实际上如果您使用:

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 回答
0

您可以尝试更改以下行吗

NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];

NSData *Data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];

以及下面的行

TFHpple *xpath = [[TFHpple alloc] initWithHTMLData:htmlData];

TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data]; 

让我知道这是否有帮助,否则您可能需要在代码中更改另一行。

快乐编码!

于 2013-07-22T16:03:10.870 回答