我发现了各种问题,最后我解决了所有问题。首先,有必要对 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];
});