网页内容抓取 php(若是给你一个网页连接,来抓取指定的内容)
优采云 发布时间: 2021-09-26 04:17网页内容抓取 php(若是给你一个网页连接,来抓取指定的内容)
如果给你一个网页链接来捕捉指定的内容,比如豆瓣电影排行榜,你怎么做?html
事实上,web内容的结构与XML非常相似,因此我们可以通过解析XML来解析HTML,但两者之间仍然存在很大的差距。嗯,没有什么废话。让我们开始解析HTML。ios
有许多用于解析XML的库。这里选择Libxml进行解析。因为libxml是一个C语言接口,所以我们找到了一个带有Objective-C打包接口的库hpple。它的地址是。然后网页使用豆瓣电影排名,地址是。吉特
接下来,构建一个新项目。该项目采用Arc,引入了libxml2和hpple库,并创建了实体类*敏*感*词*。完整的项目结构如下:GitHub
下面是movie的实现。这是一个实体类。根据捕获的网页的内容确定web实体
movie.hobjective-c
@interface Movie : NSObject
@property(nonatomic, strong) NSString *name;
@property(nonatomic, strong) NSString *imageUrl;
@property(nonatomic, strong) NSString *descrition;
@property(nonatomic, strong) NSString *movieUrl;
@property(nonatomic) NSInteger ratingNumber;
@property(nonatomic, strong) NSString *comment;
@end
所以最重要的部分来了。无论网页的内容是什么,我们都必须首先获得网页的内容。下面是通过nsurlconnection获取整个网页的内容。排列
- (void)loadHTMLContent
{
NSString *movieUrl = MOVIE_URL;
NSString *urlString = [movieUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
__weak ViewController *weak_self = self;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (nil == error) {
// NSString *retString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"%@", retString);
[weak_self parserHTML:data];
}
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}];
}
下面是获取网页内容的简单方法。本文不讨论一些HTTP和错误处理。因此,这里的代码相对简单。在上面的代码中,有一种parserhtml方法:解析获得的网页内容。在解析网页内容之前,请先拆下XPath。应用程序
假设一个简单的网页收录以下内容:atom
Some webpage
<p class=”normal”>This is the first paragraph
This is the second paragraph. This is in bold.
</p>
例如,如果要获取title的内容,XPath表达式为/HTML/head/title。如果要获取class=“special”节点的内容,XPath是/HTML/body/P[@class='special']。网址
因此,只要找到正确的XPath,就会得到相应的节点内容。让我们看一下用HPPER
解析HTML。
- (void)parserHTML:(NSData *)data
{
if (nil != data) {
TFHpple *movieParser = [TFHpple hppleWithHTMLData:data];
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']";
NSArray *movieNodes = [movieParser searchWithXPathQuery:movieXpathQueryString];
for (TFHppleElement *element in movieNodes) {
Movie *m = [[Movie alloc] init];
m.name = [element objectForKey:@"title"];
m.movieUrl = [element objectForKey:@"href"];
for (TFHppleElement *child in element.children) {
if ([child.tagName isEqualToString:@"img"]) {
@try {
m.imageUrl = [child objectForKey:@"src"];
}
@catch (NSException *exception) {
}
}
}
[self.movies addObject:m];
}
[self.movieTableView reloadData];
}
}
在代码的首页中找到相应节点的路径,然后使用XPathQuery搜索以获得数组。遍历组织数据后,可以在表视图中显示。具体效果如下:
嗯,网络内容已经被捕获。具体的实际项目比这更复杂。所以,这只是一个指导性的例子
参考:
注:本文为萧涵原著。请支持原创作品!如需重印,请附上原创链接: