项目中需要实现一个功能,即将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();
}