首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用TFHpple解析iOS购物结果

用TFHpple解析iOS购物结果
EN

Stack Overflow用户
提问于 2013-07-22 23:43:27
回答 2查看 1.1K关注 0票数 1

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

我尝试过很多类型的标签:

代码语言:javascript
复制
...
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
...

但没什么可做的,总是输出控制台消息:无法解析。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-25 17:47:00

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

代码语言:javascript
复制
myURL = [myURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

然后,在原始(和实际的) TFHPPLE代码(确切地说是XPathQuery.m)中,解析阶段将崩溃,因为任何时候nodeContent和Raw都为空。

代码语言:javascript
复制
[resultForNode setObject:currentNodeContent forKey:@"nodeContent"];

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

代码语言:javascript
复制
if (currentNodeContent != nil)
   [resultForNode setObject:currentNodeContent forKey:@"nodeContent"];

和:

代码语言:javascript
复制
[resultForNode setObject:rawContent forKey:@"raw"];

通过以下方式:

代码语言:javascript
复制
if (rawContent != nil)
      [resultForNode setObject:rawContent forKey:@"raw"];

我想记住这一点,因为google使用的html代码比较难,所以我决定使用这些xpathqueries:

代码语言:javascript
复制
...
        NSArray *elementsImages = [NSArray new];
        NSArray *elementsPrices = [NSArray new];
        elementsImages = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliimg\"]"];
        elementsPrices = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliprice\"]"];
...

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

代码语言:javascript
复制
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];

在此周期中,initWithContenctsOfURL多次无法正确获取页面(调试控制台编写了著名的UNABLE TO PARSE ),因此我决定使用以下命令更改它:

代码语言:javascript
复制
// 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弄乱了,试着用(并且你的视图控制器不会在等待解析器时冻结)调用父方法:

代码语言:javascript
复制
_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];
});
票数 3
EN

Stack Overflow用户

发布于 2013-07-23 00:03:11

你能试着换一下下面这行吗?

代码语言:javascript
复制
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];

代码语言:javascript
复制
NSData *Data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];

还有下面这行

代码语言:javascript
复制
TFHpple *xpath = [[TFHpple alloc] initWithHTMLData:htmlData];

代码语言:javascript
复制
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:data]; 

如果这有帮助,请让我知道,您可能还需要在代码中更改一行。

祝你编码愉快!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17791849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档