java解析html网页内容

更新时间 🔔🕙 2021年5月4日

环境:
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"}
转载请备注引用地址:编程记忆 » java解析html网页内容