通过Java进行网页抓取并生成plist创建代码
抓取网页的方法:
抓取网页可以通过正则表达式也可以通过Java。
通过firefox浏览器,安装Firebug来查看网页的源代码。
首先将要抓取的部分保存到本地,步骤如下:
1.在要抓取的位置右键,选择使用Firebug查看元素
2.鼠标悬停在特定元素上面时,元素会高亮,找到整个表格数据的标签,右键选择复制HTML,然后新建一个html文件粘贴进去,为了防止乱码,应当把网页的head也保存下来。
网页本地化完成后,用eclipse新建一个Java工程,导入jsoup.jar库,
右键如下图操作,变成“奶瓶”表示可用:
利用jSoup包抓取网页的方法:
已知网页的内部结构为:
<li><a href="http://xxx"><img src="http://xxx.jpg"><p>xxx</p></a></li>其中要抓取的部分为名称<p>标签和图片<img>标签的src属性。Elements为元素数组,得到的是多条li数据,Element为从li中获取的元素,抓取标签内属性使用attr方法,直接抓取文字使用text方法。
<span style="white-space:pre"> </span>//文件路径 String url = "/Users/soulghost/Desktop/WebCatch.html"; try{ //加载网页 Document doc = Jsoup.parse(new File(url), "UTF-8"); //抓去特定标签的元素 Elements lis = doc.select("li"); //遍历所有元素 for(int i = 0; i < lis.size(); i++){ Element li = lis.get(i); Element img = li.select("img").get(0); String imgName = img.attr("src"); Element p = li.select("p").get(0); String heroName = p.text(); } }catch (Exception e){ }
生成plist的方法:先新建字典,然后加入NSArray,最后将数组使用writeToFile直接生称为xxx.plist即可。
例如:
NSDictionary *dict1 = @{@"name":@"abc",@"icon":@"abc.png"}; NSDictionary *dict2 = @{@"name":@"efg",@"icon":@"efg.png"}; NSDictionary *dict3 = @{@"name":@"hij",@"icon":@"hij.png"}; NSArray *apps = @[dict1, dict2, dict3]; [apps writeToFile:@"/Users/soulghost/Desktop/heros.plist" atomically:YES];
注意特殊字符,例如""使用反斜杠来转义(\“)来转义。
Tip:不要忘了array的新建用 @[ ],字典用@{ }。
使用Xcode下载src中的图片:
网络数据通过二进制方式传播,使用NSData类来获取特定URL的数据:
注意一个细节,使用string的lastPathComponent方法可以获取路径中最后的文件名部分。
另一个细节,因为icon键内存放的是url,应该转化为图标名称filename,注意新建可变数组marray和可变字典来修改数据,然后生成新的数组。
NSMutableArray *marray = [NSMutableArray array]; for (NSDictionary *hero in array) { NSString *iconURL = hero[@"icon"]; NSURL *url = [NSURL URLWithString:iconURL]; NSData *data = [NSData dataWithContentsOfURL:url]; NSString *filename = [iconURL lastPathComponent]; NSString *path = [NSString stringWithFormat:@"/xxx/%@",filename]; [data writeToFile:path atomically:YES]; NSMutableDictionary *newDict = [NSMutableDictionary dictionary]; newDict[@"name"] = hero[@"name"]; newDict[@"icon"] = filename; [marray addObject:newDict]; }