使用TFHpple解析网页

时间:2016-01-10 06:24:52

标签: html ios objective-c tfhpple

我正在尝试编写一个非常简单的iOS应用程序来解析网页(http://arxiv.org/list/cond-mat/recent)并显示它的简化版本。我选择使用TFHpple来解析这个页面。我想获得论文的标题并在TableViewController中显示它们。纸质描述的HTML容器如下所示:

<div class="list-title">
<span class="descriptor">Title:</span> Encoding Complexity within Supramolecular Analogues of Frustrated  Magnets
</div>

我用来解析和获取值的函数如下(感谢raywenderlich.com):

- (void) loadPapers{
    NSURL *papersURL = [NSURL URLWithString:@"http://www.arxiv.org/list/cond-mat/recent"];
    NSData *papersHTMLData = [NSData dataWithContentsOfURL:papersURL];

    TFHpple *papersParser = [TFHpple hppleWithHTMLData:papersHTMLData];

    NSString *papersXpathQueryString = @"//div[@class='list-title']";
    NSArray *papersNodes = [papersParser searchWithXPathQuery:papersXpathQueryString];

    NSMutableArray *newPapers = [[NSMutableArray alloc] initWithCapacity:0];

    for (TFHppleElement *element in papersNodes){
        Paper *paper = [[Paper alloc] init];
        [newPapers addObject:paper];

        paper.title = [[element firstChild] content];
    }

    _objects = newPapers;
    [self.tableView reloadData];

}

此函数应解析整个HTML页面并将数据返回到TableView。但是,当我尝试它时,将空对象返回到paperNodes数组中。基本上,元素的数量是正确的(~25),但它们都是空的,我不知道为什么。

非常感谢任何帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

我已使用HTMLKit重写了您的代码。它看起来像这样:

NSURL *papersURL = [NSURL URLWithString:@"http://www.arxiv.org/list/cond-mat/recent"];
NSData *papersHTMLData = [NSData dataWithContentsOfURL:papersURL];
NSString *htmlString = [[NSString alloc] initWithData:papersHTMLData encoding:NSUTF8StringEncoding];

HTMLDocument *document = [HTMLDocument documentWithString:htmlString];

NSArray *divs = [document querySelectorAll:@"div[class='list-title']"];

for (HTMLElement *element in divs) {
    NSLog(@"%@", element.textContent);
}

回到评论中的问题:

  

您能否提供一些有用的链接,您会发现有关HTMLKit的好消息?

您可以查看项目GitHub页面上的示例。源代码已记录在案并使用它相对简单。如果你有基本的HTML&amp;然后使用HTMLKit的CSS体验也同样容易。不幸的是,还没有其它资源可供学习。

答案 1 :(得分:0)

[element firstChild]可能返回nil。我建议你添加一些NSLog语句来跟踪数据提取并帮助你查明错误。