使用 TFHpple 解析网页
Parsing a web page with 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 页面和 return 数据解析到 TableView 中。但是,当我尝试将 return 空 objects 放入 paperNodes 数组时。基本上,元素的数量是正确的(~25),但它们都是空的,我不确定为什么。
非常感谢任何帮助!谢谢!
可能 [element firstChild] 返回 nil。我建议您添加一些 NSLog 语句来跟踪数据提取并帮助您查明错误。
我已经用 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);
}
回到评论中的问题:
Could you give some useful links that you find good to learn about HTMLKit?
您可以在项目的 GitHub 页面上查看示例。源代码已记录在案,使用起来相对简单。如果您有基本的 HTML & CSS 经验,那么使用 HTMLKit 将同样容易。不幸的是,还没有其他资源可以学习它。
我正在尝试编写一个非常简单的 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 页面和 return 数据解析到 TableView 中。但是,当我尝试将 return 空 objects 放入 paperNodes 数组时。基本上,元素的数量是正确的(~25),但它们都是空的,我不确定为什么。
非常感谢任何帮助!谢谢!
可能 [element firstChild] 返回 nil。我建议您添加一些 NSLog 语句来跟踪数据提取并帮助您查明错误。
我已经用 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);
}
回到评论中的问题:
Could you give some useful links that you find good to learn about HTMLKit?
您可以在项目的 GitHub 页面上查看示例。源代码已记录在案,使用起来相对简单。如果您有基本的 HTML & CSS 经验,那么使用 HTMLKit 将同样容易。不幸的是,还没有其他资源可以学习它。