由新水浒到htmlparser的一次运用
最近在看新水浒,被108好汉的英雄气概所折服了,这里面的些许台词不仅是当时人民生活的写照,和当今也类似之处。“我爸是李刚”是鲜活的小衙内的翻版,强人欺压百姓,官员相互勾结。。。。。,莫谈国事,哈哈。看了之后就是想把108个好汉的剧照给下载下来,后来找了一找,有一个网站收录了(可怜不全,只有五十四个)。问题来了,我可不想一个一个图片的下载,然后再去和名字一个一个对应。可能你也想到了,对,用程序解析这个网站的html,然后去下载图片,岂不很省力。以前接触过htmlparser,下面分享一下我是怎么做的啦。希望对你有帮助。
?
通过这个程序,我想你以后如果要下载很多琐碎的东西,如果还是一个个的去点击右键,另存为。。。那么你真得OUT了,哈哈
?
先简单介绍下htmparser.希望没用过的兄弟们有个了解。
htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。可以说当前它是解析html文件最好的一个工具了,无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。
?
htmlparser基本功能1.信息提取 文本信息抽取,例如对HTML进行有效信息搜索 链接提取,用于自动给页面的链接文本加上链接的标签 资源提取,例如对一些图片、声音的资源的处理 链接检查,用于检查HTML中的链接是否有效 页面内容的监控2.信息转换 链接重写,用于修改页面中的所有超链接 网页内容拷贝,用于将网页内容保存到本地 内容检验,可以用来过滤网页上一些令人不愉快的字词 HTML信息清洗,把本来乱七八糟的HTML信息格式化 转成XML格式数据? 下面分享我的程序源代码,希望对你有参考作用。
? ?注:程序是用eclipise开发,最好把项目编码设置为utf-8
? ?下面附上htmlparser开发包和api。如果想要最新的jar,可以去官网下载。
??package test.video.htmlparser;
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import org.htmlparser.Node;import org.htmlparser.Parser;import org.htmlparser.filters.HasAttributeFilter;import org.htmlparser.filters.NodeClassFilter;import org.htmlparser.tags.ImageTag;import org.htmlparser.util.NodeList;public class ShuiHuInfo {private String mainUrl="http://www.chachaba.com/";//这个是我想下载图片网站主页public static void main(String[] args) {ShuiHuInfo sh=new ShuiHuInfo();//下面分别对每一个页面进行下载,共三页,参数i是为了拼接url用的for(int i=3;i<=5;i++){sh.getImage(i);}}public void getImage(int i){String url=mainUrl+"news/html/yule/dianshi/20110815_32260_" +i+".html";//拼接url,这个页面中有好汉的图片和名字//得到页面的html代码String content=getContent(url);//paser就是用到的解析对象了Parser parser=new Parser();//可以通过查看html代码,发现每一个图片都有class=al-wrapper键值对,生成对应的过滤器HasAttributeFilter filter=new HasAttributeFilter("class","al-wrapper");try {//下面就是解析代码了parser.setInputHTML(content);NodeList list=parser.parse(filter);for(int j=0;j<list.size();j++){Node node=list.elementAt(j);NodeClassFilter f1=new NodeClassFilter(ImageTag.class);NodeList l=node.getChildren().extractAllNodesThatMatch(f1);ImageTag imagetag=null;if(l.size()>0)imagetag=(ImageTag)l.elementAt(0);;String imageUrl=mainUrl+imagetag.getImageURL();URLConnection imgcon=new URL(imageUrl).openConnection();InputStream in=imgcon.getInputStream(); HasAttributeFilter f2=new HasAttributeFilter("class","desc");l=node.getChildren().extractAllNodesThatMatch(f2);Node n=null;if(l.size()>0)n=l.elementAt(0);String filename=new String(n.getFirstChild().getText().getBytes(),"utf-8");//System.out.println(filename);//将好汉的名字作为文件名字,并将图片的内容写入对应文件writeFile(filename,in);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void writeFile(String filename,InputStream in){File file=new File("img");if(!file.exists())file.mkdir();File image=new File(file,filename+".jpg");BufferedOutputStream writer=null;BufferedInputStream reader=null;try {writer=new BufferedOutputStream(new FileOutputStream(image));reader=new BufferedInputStream(in);int len=-1;byte []buf=new byte[1024];while((len=reader.read(buf))!=-1)writer.write(buf, 0, len);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {reader.close();writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public String getContent(String url){URL u=null;URLConnection con=null;InputStream in=null;BufferedReader reader=null;StringBuffer buffer=null;try {u = new URL(url);con=u.openConnection();in=con.getInputStream(); reader=new BufferedReader(new InputStreamReader(in));buffer=new StringBuffer();String str=null;while((str=reader.readLine())!=null){buffer.append(str+"\n");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return buffer.toString();}}??
?
?
?