iOS html/xml使用TFHpple解析谷歌购物结果

iOS html/xml使用TFHpple解析谷歌购物结果,ios,parsing,tfhpple,Ios,Parsing,Tfhpple,是否有任何方法可以使用TFHpple解析google购物结果,而不使用google API(已弃用),但只使用url,例如: 我尝试了多种类型的标签: ... myCar = @"Audi R8"; myURL = [NSString stringWithFormat:@"https://www.google.com/search?hl=en&tbm=shop&q=%@",myCar]; NSData *htmlData = [[NSData alloc] initWithCon

是否有任何方法可以使用TFHpple解析google购物结果,而不使用google API(已弃用),但只使用url,例如:

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

...
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
...
。。。
myCar=@“奥迪R8”;
myURL=[NSString stringWithFormat:@”https://www.google.com/search?hl=en&tbm=shop&q=%@“,我的车];
NSData*htmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:myURL]];
TFHpple*xpath=[[TFHpple alloc]initWithHTMLData:htmlData];
//使用xpath搜索元素
NSArray*元素=[NSArray new];

elements=[XPathSearchWithXPathQuery:@//html//body];// 你能试着换一下下面这行吗

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

还有下面这行

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

如果这有帮助,请告诉我还有一行代码需要更改


快乐编码

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

myURL = [myURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
然后,在原始(和实际)TFHPPLE代码(确切地说是XPathQuery.m)中,解析阶段将崩溃,因为任何时候nodeContent和Raw都为零。 所以,为了解决这次事故,我改变了

[resultForNode setObject:currentNodeContent forKey:@"nodeContent"];
with(注意两行[resultForNode…:

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

与:

我想记住,因为谷歌使用的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在循环过程中多次无法正确获取页面(调试控制台编写著名的无法解析),因此我决定使用以下方法对其进行更改:

// 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不会冻结等待解析器):


通过更改NSData类型变量的名称或更改解析器变量的名称,应该更改什么?如果您想知道结果明显为零,则没有任何更改。
if (rawContent != nil)
      [resultForNode setObject:rawContent forKey:@"raw"];
...
        NSArray *elementsImages = [NSArray new];
        NSArray *elementsPrices = [NSArray new];
        elementsImages = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliimg\"]"];
        elementsPrices = [xpath searchWithXPathQuery:@"//html//*[@class=\"psliprice\"]"];
...
NSData *htmlData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myURL]];
// 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
}
_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];
});