Невозможно получить данные из тега div с помощью анализа HTML (hpple) в iPhone - PullRequest
0 голосов
/ 17 февраля 2012

Я пытаюсь разобрать ссылку ниже, используя hpple:

http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech

Код:

- (void)parseURL:(NSURL *)url {
    NSData *htmlData = [NSData dataWithContentsOfURL:url];    
    TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
    NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];
    NSLog(@"elements %@",elements);
    TFHppleElement *element = [elements objectAtIndex:0];
    NSString *myTitle = [element content];
    [xpathParser release];
}

но он падает. Отчет о сбое:

XPath error : Invalid expression
<div class="body" id="article-529748-body">
^
XPath error : Invalid expression
<div class="body" id="article-529748-body">
^

Как решить эту проблему? почему мой массив элементов пуст? Я неправильно анализирую? Я хочу получить информацию, доступную в этом теге div.

Ответы [ 3 ]

0 голосов
/ 20 августа 2014

Попробуйте изменить это:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];

На:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"//div [@class='body'] [@id=\'article-529748-body\']"];
0 голосов
/ 22 октября 2014

Запись этого (2 года спустя!) На случай, если это пригодится кому-то еще с подобной проблемой.

Чтобы разобрать html в div, вам нужно

  1. использовать синтаксис аналогично (одиночные кавычки не нужно экранировать) с тем, который цитирует JamMySon на этой странице
  2. помните, что [элемент содержимого] только дает вам содержимое (если таковое имеется) для этого узла, а НЕ его дочерние элементы.

Из-за этого вам, возможно, придется использовать рекурсию для обхода дерева узлов div.

Код (ARC):

- (void) decanterHpple{
    NSURL *url = [NSURL URLWithString:@"http://www.decanter.com/news/wine-news/529748/mimimum-pricing-opponents-slam-cameron-speech"];
    NSData *htmlData = [NSData dataWithContentsOfURL:url];

    TFHpple *pageParser = [TFHpple hppleWithHTMLData:htmlData];

    NSString *queryString = @"//div[@id='article-529748-body']";//1.works with unescaped single-quotes(') AND 2.No need for class='' when using id=''
    NSArray *elements = [pageParser searchWithXPathQuery:queryString];

    //old code ~ slightly amended
    if([elements count]){
        TFHppleElement *element = [elements objectAtIndex:0];
        NSString *myTitle = [element content];
        NSLog(@"myTitle:%@",myTitle );
    }
    //new code
    NSString *theText = [self stringFromWalkThruNodes:elements];
    NSLog(@"theText:%@",theText );
}

с использованием этого рекурсивного метода:

- (NSString*) stringFromWalkThruNodes:(NSArray*) nodes {
    static int level = 0;//level is only useful for keeping track of recursion when stepping through with a breakpoint
    level++;//put breakpoint here...
    NSString *text = @"";
    for (TFHppleElement *element in nodes){
        if (element.content) {
            text = [text stringByAppendingString:element.content];
        }
        if (element.children) {
            NSString *innerText = [self stringFromWalkThruNodes:element.children];
            text = [text stringByAppendingString:innerText];
        }
    }
    level--;
    return text;
}

Это дает вывод:

2014-10-22 19: 44: 07.996 Декантированный [10148: a0b] myTitle: (null)

2014-10-22 19: 44: 07.997 Декантированный [10148: a0b] theText:

Во время посещения больницы на северо-востоке Англии, г-н Кэмерон должен призвать индустрию напитков сделать больше для решения проблемы, которая стоит Национальной службе здравоохранения £ 2,7 млрд в год. Запрет на продажу алкоголь ниже себестоимости - меньше, чем уплаченный налог на него - устанавливается введен в Англии и Уэльсе с 6 апреля, но министры ожидается подтолкнуть к более высокой минимальной цене на напиток. Противники минимальная цена за единицу говорит, что это несправедливо, потому что это наказывает всех пьющих, не просто выпивка или проблемы пьющих. Отвечая на премьер-министра комментарии, представитель Ассоциации торговли вином и спиртными напитками Гэвин Партингтон подтвердил приверженность компании по производству напитков helping помочь правительству решать проблемы злоупотребления алкоголем вместе с другими заинтересованными сторонами. Именно поэтому мы прилагаем все усилия через Соглашение об ответственности общественного здравоохранения на целый ряд инициатив по поощрению ответственного употребления алкоголя. Партингтон сказал, что инициативы включают расширение сообщества Алкогольные партнерства по всей Великобритании и национальная кампания ритейлеры для повышения осведомленности потребителей о единицах алкоголя в Алкогольные напитки. Партингтон сказал: «В отличие от этих мер, минимальная единица ценообразование является тупым инструментом, который не сможет решить проблему злоупотребления алкоголем и наказать подавляющее большинство ответственных потребители. Как признают министры правительства, это также возможно нелегал ». Декантер тоже против схемы, называя это «В корне ошибочный». «Настоящая проблема», - считает редактор Гай Вудворд сказал, ‘лежит с супермаркетами, которые используют вино в качестве лидера потерь, резать маржи, издевательства над поставщиками и снижение цен, чтобы привлекать клиентов… Продажа вина в убыток не помогает ни потребителям, ни торговля. 'Другие противники схемы включают британское пиво и Ассоциация пабов, которая рассказала Би-би-си, есть опасность, что это будет сделано через более высокие налоги, которые были бы чрезвычайно разрушительными для пабы, общественные пабы и пивовары, стоимостью тысячи жизненно важных рабочие места. Предполагается, что любой шаг к минимальной цене может быть незаконно в соответствии с европейским законодательством о конкуренции, которое направлено на подавление цены для потребителей и позволяющие фирмам работать в свободном рынок.

PS. Только начал играть с Hpple в этот час. после прочтения вышеупомянутого учебника Wenderlich ; Я уверен, что кто-то более опытный может предложить более элегантное решение!

0 голосов
/ 18 февраля 2012

Убедитесь, что ваш массив элементов не пуст

- (void)parseURL:(NSURL *)url {
NSData *htmlData = [NSData dataWithContentsOfURL:url];    
TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];
NSArray *elements  = [xpathParser searchWithXPathQuery:@"<div class=\"body\" id=\"article-529748-body\">"];
NSLog(@"elements %@",elements);
if([elements count]){
    TFHppleElement *element = [elements objectAtIndex:0];
}
NSString *myTitle = [element content];
[xpathParser release];
}
...