由于项目需要得到html内的所有js代码,就想应该有解析html的java库。
然后就找到了jsoup 。
它操作html相当方便,拥有类似jquery选择器的语法,可以方便的访问html dom。
下面是一个简单示例,能够从指定html文件中提取js
/**
* @param html 提取单个html文件内嵌和引用的全部js
* 如果有多个script包含内嵌js,程序会首先把这些js源码连接成一个字符串以html绝对路径为key保存到返回值
* 引用的js文件源码,以js绝对路径为key,源码为值保存到返回结果
* */
public static Map<String,String> extractJsFromHtml(File html) throws MalformedURLException, IOException {
PrintWriter pw=null;
try{
CodeDetectUtil.initCodeDetector();
Document htmldoc=DataUtil.load(html, CodeDetectUtil.detectCharset(html), html.toURI().getPath());
Elements scripts=htmldoc.select("script");
Map<String,String> jscode=new HashMap<String,String>();
StringWriter sw=new StringWriter();
pw=new PrintWriter(sw);
for(Element script : scripts){
String type=script.attr("type");
String language=script.attr("language");
if((Help.isEmpty(type) || type.equals("text/javascript")) &&
(Help.isEmpty(language) || language.equals("javascript"))){
String src=script.attr("src");
if(Help.isEmpty(src)){
pw.println(script.html().trim());
}else{
File jsfile=null;
if(src.startsWith(JsChecker.uriPrefix)){
jsfile=new File(Help.isEmpty(webappPath)?html.getParent():webappPath,src.substring(JsChecker.uriPrefix.length()));
}else{
jsfile=new File(html.getParentFile(),src);
}
jscode.put(jsfile.getAbsolutePath(),FileUtil.loadTxt(jsfile, CodeDetectUtil.detectCharset(jsfile)));
}
}
}
pw.flush();
jscode.put(html.getAbsolutePath(),sw.toString());
return jscode;
}finally{
CodeDetectUtil.endCodeDetector();
}
}