环境:
jdk:1.8
解析html的内容有jsoup,htmlparser等工具。
从使用的方便程度上来说,个人认为jsoup更加好。htmlparser经常会有额外的\n,节点位置不对的情况出现。
1.可以通过css query的选择来选取节点
2.获取的节点的text和html内容。
text内容为网页上显示的内容;
html为网页源代码。
3.可以很方便的获取该dom节点的上一个节点,下一个节点,父节点,子节点,以及子节点中进行条件筛选(通过css query方式。)
4.通过与java1.8的js引擎结合,可以方便的获取网页中的json内容。
Jsoup官网地址
jsoup官方帮助文档
jsoup选择表达式使用方式
测试工程代码
html内容
<!--STATUS OK--> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="publishtime" content="2015-06-09 19:08:11"> <title>百度百家</title> <script src="http://musicbusiness.baijia.baidu.com/static/js/libs/jquery/jquery.cookie.js" type="text/javascript"></script> <script id="myscript"> var myJson = {type:"测试type",value:"我就是测试value"}; function add(a, b) { return a + b; } </script> <div id="header" alog-group="log-header"> <div class="div1 divclass">div1内容</div> <div class="div2 divclass">div2内容</div> <div class="div3 divclass">div3内容</div> </div> <dl> <dt> <a href="http://www.baidu.com"> <img width="50" height="50" src="http://musicbusiness.baijia.baidu.com/static/images/03.png"> </a> dt内容 </dt> <dd> <div class="ddclass">我就是dd</div> <ul class="kk"> <li id="z001"> <h4> <a href="http://www.bing.com">必应</a> </h4> </li> </ul> </dd> </dl>
java代码
package htmlparse; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; public class Test { /** * 获取文件内容 * @param filePath * @return */ private static String getFileContent(String filePath) { StringBuffer sb = new StringBuffer(); try ( FileInputStream fis = new FileInputStream(filePath); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); ){ String read = null; while ((read = br.readLine()) != null) { sb.append(read); } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } public static void main(String[] args) { // 解析html String htmlPage = getFileContent(Test.class.getResource("/test.html").getFile()); Document doc = Jsoup.parse(htmlPage);// 还有其他方法,读取文件,读取url // 获取title Element titleNode = doc.select("title").first(); System.out.println("title:" + titleNode.text()); // 获取【id】为【header】的节点 Element idNode = doc.getElementById("header"); System.out.println("header节点:" + idNode.text()); // 获取【id】为【header】的节点下的【class】为【div2】的节点 Element div2Node = idNode.getElementsByClass("div2").first(); System.out.println("div2节点:" + div2Node.text()); // 获取【id】为【header】的节点下的【class】为【div2】的节点 div2Node = idNode.select(".div2").first(); System.out.println("div2节点:" + div2Node.text()); // 获取dt节点 Element dtNode = doc.select("dl > dt").first(); System.out.println("dt节点:" + dtNode.text()); // 获取js代码 Element jsNode = doc.getElementById("myscript"); System.out.println("js节点:" + jsNode.html()); // 使用js引擎来执行js,获取json数据 ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("nashorn"); try { engine.eval(jsNode.html()); String result = engine.eval("add(5,3)").toString(); System.out.println("js 执行结果:" + result); // 获取json数据 result = engine.eval("JSON.stringify(myJson)").toString(); System.out.println("json 内容:" + result); } catch (ScriptException e) { e.printStackTrace(); } } }
执行结果:
title:百度百家 header节点:div1内容 div2内容 div3内容 div2节点:div2内容 div2节点:div2内容 dt节点:dt内容 js节点:var myJson = {type:"测试type",value:"我就是测试value"};function add(a, b) { return a + b;} js 执行结果:8 json 内容:{"type":"测试type","value":"我就是测试value"}