js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

优采云 发布时间: 2022-03-16 05:15

  js抓取网页内容(解析XML网页链接来抓取指定的内容比如豆瓣电影排行榜,)

  如果给你一个网页链接去抓取特定的内容,比如豆瓣电影排名,你怎么做?

  其实网页内容的结构和XML很相似,所以我们可以通过解析XML来解析HTML,但是两者之间还是有很大差距的。好了,事不宜迟,让我们开始解析 HTML。

  然后解析xml的库很多,这里我们使用libxml来解析,因为libxml是C语言接口,我找了一个library-hpple用objective-c封装接口,它的地址是,那么网页用的是豆瓣电影排名,地址是。

  接下来新建项目,使用ARC,引入libxml2和hpple库,新建实体类movie。完整的项目结构如下:

  

  movie的实现如下,这是一个实体类,根据爬取的网页内容确定实体

  电影.h

  1@interface Movie : NSObject

2@property(nonatomic, strong) NSString *name;

3@property(nonatomic, strong) NSString *imageUrl;

4@property(nonatomic, strong) NSString *descrition;

5@property(nonatomic, strong) NSString *movieUrl;

6@property(nonatomic) NSInteger ratingNumber;

7@property(nonatomic, strong) NSString *comment;

8@end

9

  那么最重要的部分就到这里了,不管网页的内容是什么,我们都需要先获取网页的内容。下面是通过NSURLConnection获取整个网页的内容。

  1- (void)loadHTMLContent

2{

3 NSString *movieUrl = MOVIE_URL;

4 NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

5 NSURL *url = [NSURL URLWithString:urlString];

6

7 NSURLRequest *request = [NSURLRequest requestWithURL:url];

8

9 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

10

11 __weak ViewController *weak_self = self;

12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

13 if (nil == error) {

14// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

15// NSLog(@"%@", retString);

16 [weak_self parserHTML:data];

17 }

18

19 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

20 }];

21}

22

  这只是获取网页内容的一种简单方法。一些HTTP和错误处理本文不讨论,所以这里的代码比较简单。上面代码中有一个parserHTML:方法,就是对获取到的网页内容进行解析。在此之前,让我们拆除 xpath。

  假设一个简单的网页收录以下内容:

  1

3    Some webpage

6    This is the first paragraph

7    This is the second paragraph. This is in bold.

8   

9

  比如要获取title的内容,那么xpath表达式就是/html/head/title。如果要获取 class="special" 节点内容,xpath 为 /html/body/p[@class='special']。

  所以只要找到合适的xpath,就会得到对应的节点内容,接下来我们用hpple来解析html

  1- (void)parserHTML:(NSData *)data

2{

3 if (nil != data) {

4 TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];

5 NSString *movieXpathQueryString = @"/html/body/div[@id='wrapper']/div[@id='content']/div[@class='grid-16-8 clearfix']/div[@class='article']/div[@class='indent']/table/tr/td/a[@class='nbg']";

6 NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];

7

8 for (TFHppleElement *element in movieNodes) {

9 Movie *m = [[Movie alloc] init];

10 m.name = [element objectForKey:@"title"];

11 m.movieUrl = [element objectForKey:@"href"];

12

13 for (TFHppleElement *child in element.children) {

14 if ([child.tagName isEqualToString:@"img"]) {

15 @try {

16 m.imageUrl = [child objectForKey:@"src"];

17 }

18 @catch (NSException *exception) {

19

20 }

21 }

22 }

23

24 [self.movies addObject:m];

25 }

26

27 [self.movieTableView reloadData];

28 }

29}

30

  代码中,第一页找到对应节点的路径,然后searchWithXPathQuery得到一个数组。遍历组织数据后,可以在表格视图中展示。具体效果如下:

  

  嗯,网页的内容已经爬出来了,实际项目比这个复杂,所以这里只是一个指导性的例子。

  参考:

  注:本文由小涵撰写,请支持原创!如需转载,请附上原文链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线