天天看點

java-jsoup-解析html文本

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);
  }
}