日期:2014-05-17  浏览次数:20554 次

htmlparser解析网页代码实现网站自动抓取新闻并定时更新
  参加工作快有两年了,一直都是从网上谷歌人家的经验,这次也把自己的开发经验写下来与别人分享下。刚不久,换了一份新工作,新的公司在刚结束了一个网站。网站的新闻内容都是自己编辑添加上去的,全手动的,于是接受任务,做个自动更新新闻内容的功能。
  开始整理思路,第一步通过网站URL得到整个网站新闻链接所有的URL,第二步把得到的URL返回它的源代码,第三步解析出源代码里的内容和标题,第四步存入数据库。最后使用java定时器定时自动更新。
  过程中最棘手的是解析HTML源码,果断决定使用htmlparser,废话少说,上一部分代码。代码部分注释,写的不好,还请指教。
	/**
	 * 返回网页中所有URL
	 * @return type:NodeList
	 */
	public static NodeList getAllUrl(String Url) throws Exception {

		//使用htmlparser获取
		Parser parser = new Parser();
		parser.setResource(Url);
		//待定的编码格式
		parser.setEncoding("gbk");
		//遍历所有节点 自定义内部类(自定义过滤器)
		NodeList nodeList = parser.extractAllNodesThatMatch(new NodeFilter() {
			private static final long serialVersionUID = 1L;

			public boolean accept(Node node) {
				//判断node是否是LinkTag的一个实例
				if (node instanceof LinkTag)
					return true;
				else{
					return false;
			}
			}
		});
		return nodeList;
	}

	
	/*
	 * 返回新闻内容
	 */
	public static String getContent(String urlpath){
		Parser parser = new Parser();
		String content = "";
		try {
			parser.setResource(urlpath);//传入url
			NodeFilter divFilter = new NodeClassFilter(Div.class);//自定义过滤器
			NodeList divlist = parser.parse(divFilter);//加载过滤器			
			for(int i=0;i<divlist.size();i++){	
				Node node = divlist.elementAt(i);	//遍历所有div标签
				if (node.getText().toString().equals("div id='zoom'")){
					content = node.toPlainTextString();	//得到指定div内容				
				};
			}
		} catch (ParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return content;
	}
}
	/*
	 *返回新闻title
	 * 
	 */
	public static String getTitle(String urlpath)throws Exception{
		Parser parser = new Parser();
		parser.setResource(urlpath);
		parser.setEncoding("gbk");
		NodeFilter titleFilter = new NodeClassFilter(TitleTag.class);
		NodeList titleList = parser.parse(titleFilter);
		String title = "";
		for (int i = 0; i < titleList.size(); i++) {
			Node node = titleList.elementAt(i);
			if (node instanceof TitleTag) {
				TitleTag titleTage = (TitleTag) node;
				title = titleTage.getStringText();
			}
		}
		return title;
	}

定时器在这就不写了,相信大家都能搞定。希望跟大家能共同交流学习哈!