【Jsoup】Jsoup解析Html标签(Java后台解析)
中文API网站(下载地址): http://www.open-open.com/jsoup/
有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成一个完整的Html文档,也或者需要解析其中的文字(text()),Java后台处理用Jsoup非常方便,也可以用选择器快速获取元素,类似于jQuery。获取到文档对此之后对其处理与JS处理DOM一样方便,选取元素也类似于JS,也有类似于jQuery的语法,官方的解释
1.最基本的解析Html字符串
@Test public void testHtmlToString2() { String html = "<p>这是一个段落<img src=\"test.img\"/>内容;</p>"; Document doc = Jsoup.parse(html); System.out.println(doc); // 输出带标签的html文档 System.out.println("---------------------\n"+doc.text()); // 输出内容 Elements element = doc.getElementsByTag("p"); System.out.println("---------------------\n"+element.get(0).html()); }
结果:
<html> <head></head> <body> <p>这是一个段落<img src="test.img">内容;</p> </body> </html> --------------------- 这是一个段落内容; --------------------- 这是一个段落<img src="test.img">内容;
2.解析字符串
// 解析html字符串 @Test public void testHtmlToString() { String html = "<html><head><title>First parse</title></head>" + "<body><p style='center'>Parsed HTML into a doc.</p></body></html>"; Document doc = Jsoup.parse(html); System.out.println(doc); // 输出带标签的html文档 System.out.println("---------------------\n"+doc.text()); // 输出内容 }
结果:
<html>
<head>
<title>First parse</title>
</head>
<body>
<p style="center">Parsed HTML into a doc.</p>
</body>
</html>
---------------------
First parse Parsed HTML into a doc.
3.// 解析body片段
@Test public void test2() { String html = "<div><p>Lorem ipsum.</p>"; Document doc = Jsoup.parseBodyFragment(html); System.out.println(doc); System.out.println(doc.text()); }
结果:
<html>
<head></head>
<body>
<div>
<p>Lorem ipsum.</p>
</div>
</body>
</html>
Lorem ipsum.
4.// 解析一个url与用选择器选择元素(相当于查看源码)
@Test public void test4() throws IOException { Document doc = Jsoup.connect("http://qiaoliqiang.cn:8080/").get(); String title = doc.title();// 获取title System.out.println(title); System.out.println("---------------------\n"+doc.toString()+"---------------------\n");// 输出文档全部 Elements links = doc.getElementsByTag("a"); for (Element ele : links) { System.out.println(ele.toString()); } }
Apache Tomcat/7.0.72
---------------------
<!doctype html>
<html lang="en">
<head>
<title>Apache Tomcat/7.0.72</title>
<link href="favicon.ico" rel="icon" type="image/x-icon">
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon">
..........
5.选择器解析HTML并且提取input的value值:(获取元素的属性)
/** * <span class="bigNum">二</span>、 * <span><input class="el_modifiedTitle" value="多选题" type="text"> </span> * <span>(每到题 <input class="el_modifiedGrade" value="2" type="text"> </span> * <span> 分;共</span><span class="numTotal">4分/</span> * <span class="numQues">2题)</span> * * @param html * @return */ // 去掉大题的标签 public static String removeBigQues(String html) { StringBuffer sb = new StringBuffer(); Document doc = Jsoup.parse(html); System.out.println(doc); System.out.println(doc.text()); sb.append(doc.select(".bigNum").get(0).text() + ". "); sb.append(doc.select(".el_modifiedTitle").get(0).attr("value")); sb.append(doc.select("span").get(2).text() + doc.select(".el_modifiedGrade").get(0).attr("value")); sb.append(doc.select("span").get(3).text()); sb.append(doc.select("span").get(4).text()); sb.append(doc.select("span").get(5).text()); System.out.println(sb.toString()); return sb.toString(); }
补充:今天发现Jsoup竟然没有解析元素style的方法,所以只能自己手写
先获取到style属性,再对style属性进行处理,例如:
String style = "position: absolute; width: 500px; height: 552px;"; String extract = "width"; if (style.contains(extract)) { style = style.substring(style.indexOf(extract)); System.out.println(style); style = style.substring(0, style.indexOf(";")); System.out.println(style); String attr = style.substring(style.indexOf(":") + 2); System.out.println(attr.substring(0, attr.indexOf("px"))); }
补充:元素的html()与outerHtml()的区别
html()会返回包括子元素的内容以及标签,不包括自己
outerHtml()会返回包括自己在内的元素。
在jQuery中如果返回子元素的内容也是html(),如果返回包括自己的内容需要用$("#chartdiv").prop("outerHTML");//会返回包括自己在内的内容