HtmlCleaner 解析 HTML

HtmlCleaner是一款高效的HTML解析器,支持 Xpath语法提取HTML中的节点或元素。

添加依赖

net.sourceforge.htmlcleaner htmlcleaner 2.29

使用

下面的方法还需要使用 Jsoup 从网络上面获取 HTML,然后用 HtmlCleaner 来进行解析。

 @RequestMapping("ana")
    public String analysis() throws IOException, XPatherException {
        Document document = Jsoup.connect("http://bj.xxxxx.com/jzbiaoqian/").timeout(5000).get();
        //Elements elements = document.select("div#list-job-id");
        String html = document.html();
        HtmlCleaner htmlCleaner = new HtmlCleaner();
 
        TagNode tagNode = htmlCleaner.clean(html);
 
        Object[] ns = tagNode.evaluateXPath("//div[@id='list-job-id']//dt//a");
 
        TagNode dlnode = ((TagNode)ns[0]);
        String url = dlnode.getAttributeByName("href");
 
        Document document1 = Jsoup.connect(url).timeout(5000).get();
 
        String  html1 = document1.html();
        HtmlCleaner htmlCleaner1 = new HtmlCleaner();
        TagNode tagNode1 = htmlCleaner1.clean(html1);
        Map<String,String> map = new HashMap<>();
 
        Object[] rs = tagNode1.evaluateXPath("//div[@class='d-c-left-hear']/h1") ;
        Object[] rs2 = tagNode1.evaluateXPath("//p[@class='data-sty mb-5']//span") ;
        Object[] rs3 = tagNode1.evaluateXPath("//ul[@class='clearfix pos-relat']/li") ;
        Object[] rs4 = tagNode1.evaluateXPath("//div[@class='deta-Corp']") ;
 
        map.put("gongsi",((TagNode)rs[0]).getText().toString());
        map.put("date",((TagNode)rs2[0]).getText().toString());
        for (Integer i =1;i<rs3.length;i++)
        {
            TagNode n = (TagNode)rs3[i];
            map.put(i.toString(),n.getText().toString());
        }
        map.put("miaoshu",((TagNode)rs4[0]).getText().toString());
 
        return map.toString();
 
    }

HtmlCleaner 类与 TagNode 类

使用 HtmlCleaner 解析 HTML 文档时,需要使用到两个类:org.htmlcleaner.HtmlCleaner 以及 org.htmlcleaner.TagNode。

HtmlCleaner 类提供了实例化 HtmlCleaner 的方法和将 指定类型输入(如 String 类型的 HTML 字符串、String 类型的 URL 等)转化成节点 (TagNode)的方法,表列举了 HtmlCleaner 类中的部分方法和说明。

方法 说明
TagNode clean(String htmlContent) 将 String 类型的 HTML 转化成 TagNode
TagNode clean(File file, String charset) 按照指定字符集将 File 中存储的 HTML 转化成 TagNode
TagNode clean(File file) 按照默认字符集将 File 中存储的 HTML 转化成 TagNode
TagNode clean(URL url, String charset) 获取 URL 对应的 HTML 内容(指定字符集),并将其转化成 TagNode
TagNode clean(URL url) 获取 URL 对应的 HTML 内容(默认字符集),并将其转化成 TagNode
TagNode clean(InputStream in, String charset) 按照指定字符集将输入流中的 HTML 内容转化成 TagNode
TagNode clean(InputStream in) 按照默认字符集将输入流中的 HTML 内容转化成 TagNode
TagNode 类提供了一系列操作节点的方法,如表所示。

TagNode 类提供了一系列操作节点的方法,如表所示。

方法 说明
Object evaluateXPath(String xPath) 基于 Xpath 语法获取 Object 数组
String getAttributeByName(String attName) 基于属性名称获取属性值
TagNode findElementByName(String findName, boolean isRecursive) 基于标签名获取节点
CharSequence getText() 获取节点中的文本
TagNode getParent() 获取父节点
List getChildTagList() 获取所有子节点,返回值为集合
boolean hasChildren() 判断是否存在子节点

针对这个项目的问题,我们把 2.29 的版本代码放到了 Git 上。

地址:honeymoose/HtmlCleaner: Open-source HTML parser - HtmlCleaner - iSharkFly SRC

整个项目也有 10 多年没有更新了。

使用 JDK 17 重新编译了下。

GitHub 的链接地址为:GitHub - honeymoose/HtmlCleaner