jsoup实现Html格式预览

黄平俊 发布于 2010/08/30 15:12
阅读 1K+
收藏 4

经过一个周末的折腾,终于用jsoup实现了html格式的预览功能,有图有真相:

预览内容

文章全文

实现思路:在重建HTML标签时,进行截取字符。

实现代码:

 

/**
	 * 截取字符串长字,保留HTML格式
	 * @param content
	 * @param len 字符长度
	 * @author jimmy
	 */
	public static String truncateHTML(String content,int len){
		Document  dirtyDocument = Jsoup.parse(content);
		Element source = dirtyDocument.body(); 
		Document clean = Document.createShell(dirtyDocument.baseUri());
		Element dest = clean.body(); 
		truncateHTML(source,dest,len);
		return dest.outerHtml();
	}
	
	/**
	 * 使用Jsoup预览
	 * @param source  需要过滤的
	 * @param dest 过滤后的对象
	 * @param len 截取字符长度
	 * @author jimmy
	 *  <br />eg.<br />
	 *  
	 *  Document  dirtyDocument = Jsoup.parse(sb.toString());<br />
		Element source = dirtyDocument.body();<br />
		Document clean = Document.createShell(dirtyDocument.baseUri());<br />
		Element dest = clean.body();<br />
		int len = 6;<br />
		truncateHTML(source,dest,len);<br />
		System.out.println(dest.html());<br />
	 */
	private static void truncateHTML(Element source, Element dest,int len) {
	    List<Node> sourceChildren = source.childNodes();
	    for (Node sourceChild : sourceChildren) {
	        if (sourceChild instanceof Element) {
	            Element sourceEl = (Element) sourceChild;
	            Element  destChild = createSafeElement(sourceEl);
 	            int txt = dest.text().length();
	            if(txt>=len){
	            	break;
	            }else{
	            	len = len - txt;
	            }
	            dest.appendChild(destChild);
	            truncateHTML(sourceEl, destChild,len);
	        } else if (sourceChild instanceof TextNode) {
	        	int destLeng = dest.text().length();
	            if(destLeng>=len){
	            	break;
	            } 
	        	TextNode sourceText = (TextNode) sourceChild;
	        	int  txtLeng = sourceText.getWholeText().length();
  	            if((destLeng+txtLeng) > len){
  	            	int tmp = len - destLeng;
  	            	String txt = sourceText.getWholeText().substring(0,tmp);
 	            	TextNode destText = new TextNode(txt, sourceChild.baseUri());
 		            dest.appendChild(destText);
 		            break;
 	            }else{
 	            	TextNode destText = new TextNode(sourceText.getWholeText(), sourceChild.baseUri());
 		            dest.appendChild(destText);
 	            }
 	        }  
	    }
     }
	  
	/**
	 * 按原Element重建一个新的Element
	 * @param sourceEl
	 * @return 
	 * @author jimmy
	 */
	private static  Element createSafeElement(Element sourceEl) {
        String sourceTag = sourceEl.tagName();
        Attributes destAttrs = new Attributes();
        Element dest = new Element(Tag.valueOf(sourceTag), sourceEl.baseUri(), destAttrs);
        Attributes sourceAttrs = sourceEl.attributes();
        for (Attribute sourceAttr : sourceAttrs) {
                destAttrs.put(sourceAttr);
        }
        return dest;
    }

原文转自:http://www.itsmile.net/blog/article_show/20/273772/jsoup-Html-Preview

加载中
0
sunzhuting356
sunzhuting356

你好,你知道用jsoup怎么获取网页正文么?

0
w
wlhbyeChina

引用来自#2楼“sunzhuting356”的帖子

 

你好,你知道用jsoup怎么获取网页正文么?

Document doc = Jsoup.connect(URL).timeout(10000).get();

Elements elements  = doc.body().getElementsByClass("Content");// 获取class 名称

Elements element  = doc.body().select("table[border=1]");//获取 HTML 标签位置

String htmlStr = elements.html();

0
bobshi
bobshi

看不到图了

0
谢小呆
谢小呆

可以获得js执行后的html结构吗

返回顶部
顶部