Java实现从html中提取css

buttonChan 2014-03-02

项目中需要实现一个功能,即将html中标签的style属性值,提取出单独的css文件。

目前已有相关的网站实现: extractcss.com

虽然开源,但是它是通过js实现,而且用到了jquery。

本文将讨论如何在java中实现类似的功能,由于项目的需要,所以只实现一部分功能(class选择器)。

该功能用到了Java中拥有类似于JQuery选择器功能的html解析工具Jsoup: http://jsoup.org/

实现的方法如下:

/**
	 * 从html中获取出css文本
	 * 参考extractCss网站
	 * 借助于Js
	 * @param html    含有style格式的html文本
	 * @return        提取出的css文本
	 */
	public static String extractCss(String html){
		Set<String> allClasses = new HashSet<String>();   // 初始化参数
		StringBuffer resultCss = new StringBuffer();
		org.jsoup.nodes.Document doc = Jsoup.parse(html);       //获取html对象
		Elements classes = doc.select("*[class]");
		for(Iterator<Element> ite = classes.iterator(); ite.hasNext();){
			Element element = ite.next();
			String splits[] = element.attr("class").split(" ");
			for(int i=0; i< splits.length; i++){
				allClasses.add(splits[i]);
				if(i==splits.length-1){
					Elements children = doc.select("."+splits[i]+"> *");
					for(Iterator<Element> tor = children.iterator(); tor.hasNext();){
						Element e = tor.next();
						if(!e.hasAttr("class")){                   //如果没有定义class属性
							allClasses.add(splits[i]+" > "+e.tagName().toLowerCase());
						}
					}
				}
			}
		}
		for(String clss: allClasses){
			Elements element = doc.select("."+clss);
			if(element.hasAttr("style")){
				resultCss.append("."+clss+"{"+element.attr("style")+"}");
			}
		}
		return resultCss.toString();
	}