最近在做一个项目,要求解析html报告里的数据,报告的规格也都不一样。就写了个简单的工具类
用到的技术是结合了 jsoup、sipsoup包的使用
maven地址:
org.jsoup
jsoup
1.10.2
com.virjar
sipsoup
RELEASE
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import com.virjar.sipsoup.exception.XpathSyntaxErrorException;
import com.virjar.sipsoup.parse.XpathParser;
/**
* @Title: ParseHtmlUtil.java
* @Package com.bluedon.track.util
* @Description: 解析html漏洞数据工具类
* @author
* @date 2017年7月12日 下午3:32:56
* @version V1.0
*/
public class ParseHtmlUtil {
private final static Logger log = Logger.getLogger(ParseHtmlUtil.class);
/**
* @Title: paserHtml
* @Description: 解析html漏洞数据
* @param filePath
* 解析的html地址
* @param rootName
* 解析的根节点名称
* @param map
* key->名称,value->解析地址规则
* @return List
public static void main(String[] args) throws Exception {
//
File file = new File("F:/OneKeyDownLoads/index.html");
Document doc = Jsoup.parse(file, "UTF-8");
Map map = new HashMap();
/*根节点 用来循环的*/
map.put("rootpath",
"//table[@id='vulDataTable']/tbody/tr[@class='even vh_ip']|//tr[@class='even vm_ip']|//tr[@class='even vl_ip']");
// map.put("desc", "//td//table/tbody/tr[2]/td[2]");
// map.put("solution","//td//table/tbody/tr[3]/td[2]");
// map.put("cve","//td//table/tbody/tr[7]/td[2]/a");
// map.put("cnnvd","//td//table/tbody/tr/td[text()*='CNNVD-']");
// map.put("cnvd","//td//table/tbody/tr/td[text()*='CNVD-']");
// map.put("type","host");
// map.put("name", "previousElementSibling//td[1]/a");
map.put("risk", "nextElementSibling//td//table/tbody/tr/td[text()*='威胁分值']");
// map.put("host", "//td//table/tbody/tr[1]/td[2]/a");
List> list = paserHtml(file, "rootpath", map);
System.out.println(JSON.toJSON(list));
System.out.println(list.size());
//System.out.println(checkRegex("previousElementSibling//td[1]/a", "^previousElementSibling.*$"));
}}