jsoup解析html(文本/img)工具类

使用jsoup对html文档进行解析,每个html标签(Element)、文本(TextNode)都抽象成一个Node,每一个Node都含有childNodes()方法来枚举其包含的Node,这里通过递归来提取文本内容,对于非TextNode的Node,我们遍历其孩子Node,对于TextNode我们直接返回结果。

其中jsoup的gradle依赖为compile 'org.jsoup:jsoup:1.11.3'

下载地址:https://jsoup.org/download

HtmlUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.app.util;

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;

import com.alibaba.druid.util.StringUtils;

public class HtmlUtils{
   
    /**
      * @Title: html2Str
      * @Description: TODO(使用jsoup解析html并转化为提取字符串)
      * @param html
      * @return String
      * @date 2020年5月7日 下午6:57:37
     */
    public static String html2Str(String html){
        if(StringUtils.isEmpty(html)) {
            return "";
        }
        Document doc = Jsoup.parse(html);    
        return extractText(doc);
    }
    /**
      * @Title: html2ImgSrc
      * @Description: TODO(使用jsoup解析html并抽取其中所有img标签中的src)
      * @param html
      * @return List<String>
      * @date 2020年5月7日 下午6:56:47
     */
    public static List<String> html2ImgSrc(String html){
        if(StringUtils.isEmpty(html)) {
            return null;
        }
        List<String> list=new ArrayList<String>();
        Document doc = Jsoup.parse(html);
        Elements elements=doc.select("img");
        for (int i = 0; i < elements.size(); i++) {
            Element jpg=elements.get(i);
            String attr = jpg.attr("src");
            list.add(attr);
        }
        return list;
    }

    private static String extractText(Node node){
        /* TextNode直接返回结果 */
        if(node instanceof TextNode){    
            return ((TextNode) node).text();  
        }  
        /* 非TextNode的Node,遍历其孩子Node */
        List<Node> children = node.childNodes();  
        StringBuffer buffer = new StringBuffer();    
        for (Node child: children) {  
            buffer.append(extractText(child));
        }  
        return buffer.toString();
    }
}