有没有办法在不使用谷歌API(不推荐使用)的情况下使用TFHpple解析谷歌购物结果,但是使用网址很简单,例如: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
...
但无所事事,总是相同的输出控制台消息:UNABLE TO PARSE。
答案 0 :(得分: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\"]"];
...
另一个不便之处是当您决定使用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进行的,请尝试调用父方法(并且你的viewcontroller不会冻结等待解析器):
_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];
});
答案 1 :(得分: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];
如果这有帮助,请告诉我,您可能需要在代码中更改一行。
快乐的编码!