java-jsoup-解析html文本
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
一、maven 依赖
<!-- dom 解析 -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
二、实例
目标:
1.删除html中有指定属性的dom节点
2.将此逻辑加入 filter 中,可以对静态html、动态jsp等标准 html 输出流,进行权限控制(需要权限控制的节点需要加埋点,即:auth-code 属性)
package com.demo.preview;
import static org.junit.Assert.*;
import java.util.ArrayList;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import com.lowagie.text.List;
import me.grass.coder.Debug;
/**
*
* @author xxj
*/
public class jsoupTest {
@Test
public void testHtml() {
StringBuffer sbf = new StringBuffer();
sbf.append("<!doctype html>");
sbf.append("<html lang=\"en\">");
sbf.append(" <head>");
sbf.append(" <meta charset=\"UTF-8\">");
sbf.append(" <meta name=\"Generator\" content=\"EditPlus®\">");
sbf.append(" <meta name=\"Author\" content=\"\">");
sbf.append(" <meta name=\"Keywords\" content=\"\">");
sbf.append(" <meta name=\"Description\" content=\"\">");
sbf.append(" <title>Document</title>");
sbf.append(" </head>");
sbf.append(" <body>");
sbf.append(" <div id=\"myDiv\"></div>");
sbf.append(" <div auth=\"myDiv\"></div>");
sbf.append(" <div auth-code=\"111\"><div id=\"\">0000</div></div>");
sbf.append(" <div auth-code=\"222\">bb</div>");
sbf.append(" <div auth-code=\"333\"><div id=\"\">5555</div></div>");
sbf.append(" <div auth-code=\"444\">dd</div>");
sbf.append(" </body>");
sbf.append("</html>");
//授权码
ArrayList<String> auths= new ArrayList<String>();
auths.add("111");
auths.add("222");
String html = sbf.toString();
Document doc = Jsoup.parse(html);
Elements eles=doc.select("[auth-code]");//查找有指定属性的元素
Debug.printFormat("匹配:{0}",eles.size());
if(eles==null || eles.size()==0){
Debug.print("无内容");
return;
}
Element e;
Integer n=0;
String authCode;
for(int i=0;i<eles.size();i++){
e = eles.get(i);
Debug.printFormat("{0}.{1}"
,(++n)
,e.outerHtml());
authCode = e.attr("auth-code");
//鉴权
if(!hasAuth(authCode,auths))
e.remove();
}
Debug.print("html内容;",doc.outerHtml());
}
/**
* 鉴权
* @param auth
* @param auths
* @return
*/
boolean hasAuth(String auth,ArrayList<String> auths){
if(auth==null || auth.isEmpty())
return false;
return auths.contains(auth);
}
}