jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup的主要功能有三部分组成:
说明:对html的解析还有另外一个工具库——HTMLParser,该项目已经不在维护了。
org.jsoup
jsoup
1.10.2
1、生成document:
//从字符串生成document
public void parseDocumentFromString() {
String html = "First parse "
+ "Parsed HTML into a doc.
";
Document doc = Jsoup.parse(html);
logger.info("parseDocumentFromString content={}", doc);
}
//从url生成document
public void loadDocumentFromURL() {
Document doc;
try {
doc = Jsoup.connect("https://www.baidu.com/").get();
// 从document中获取title值
String title = doc.title();
logger.info("LoadDocumentFromURL title={}", title);
} catch (IOException e) {
e.printStackTrace();
}
}
//从文件生成document
public void loadDocumentFromFile() {
URL fileUrl = LoadParseDocument.class.getResource("/test/loadDocumentFromFile.html");
File input = new File(fileUrl.getFile());
try {
Document doc = Jsoup.parse(input, "UTF-8", "https://www.baidu.com/");
logger.info("LoadDocumentFromFile content={}", doc);
} catch (IOException e) {
e.printStackTrace();
}
}
说明:jsoup解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:
未关闭的
Lorem
Ipsum parses to
Lorem
Ipsum
2、获取Elements:
2.1)使用类似浏览器提供给js原生的api语法:
public void extractDataByDOM() throws IOException{
Document doc = Jsoup.connect("https://www.baidu.com/").get();
Element lg = doc.getElementById("lg");
logger.info("getElementById lg = {}", lg);
Elements links = doc.getElementsByTag("a");
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
logger.info("linkHref={}, linkText={}",linkHref, linkText);
}
}
2.2)使用类似jquery语法:
public void extractDataByCSSOrJqueryLikeSelectorSyntax() throws IOException{
URL fileUrl = LoadParseDocument.class.getResource("/com/hry/tool/jsoup/extractingdata/extractDataByCSSOrJqueryLikeSelectorSyntax.html");
File input = new File(fileUrl.getFile());
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
// 获取所有的a节点
Elements links = doc.select("a[href]");
logger.info("links = {}", links);
// 获取img的src以.png结果结尾
Elements pngs = doc.select("img[src$=.png]");
logger.info("pngs = {}", pngs);
// 获取class=masthead的div节点
Element masthead = doc.select("div.masthead").first();
logger.info("masthead = {}", masthead);
// 获取class=r的h3节点下面的a节点
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
logger.info("resultLinks = {}", resultLinks);
}
3、获取属性、文本、html:
public void extractAttributesTextAndHTML(){
String html = "An example link.
";
// 指定baseUri的值,在使用abs:attr会使用到
Document doc = Jsoup.parse(html, "http://example.com/");
Element link = doc.select("a").first();
/**
* text获取所有子节点的文本并组合在一一起
* 如:HTML Hello there now!
, --》 调用p.text() --》输出: "Hello there now!"
*/
String text = doc.body().text(); // "An example link"
logger.info("text={}", text);
// 获取link的href属性值
String linkHref = link.attr("href"); // /abc
// 在href前面加上abs,会在现有的href(如/abc)的前面别上Jsoup.parse(html, "http://example.com/")里指定的baseUri值
String absLinkHref = link.attr("abs:href"); // http://example.com/abc
logger.info("linkHref={}, absLinkHref={}",linkHref, absLinkHref);
// 获取link里所有字节点的内容组合在一起
String linkText = link.text(); // "example""
logger.info("linkText={}", linkText);
// 获取本节点所有HTML文本信息
String linkOuterH = link.outerHtml(); // "example"
logger.info("linkOuterH={}", linkOuterH);
// 获取本节点字节点的html文本信息
String linkInnerH = link.html(); // "example"
logger.info("linkInnerH={}", linkInnerH);
}
}
4、设置值:
public void setHTMLofAnElement() throws IOException{
Document doc = getDoucment();
// 获取div节点
Element div = doc.select("div").first(); //
// 使用新的HTML替换div旧的html值
div.html("lorem ipsum
"); // lorem ipsum
// 将新html添加到div内部的最前面
div.prepend("First
"); // First
lorem ipsum
// 将新html添加到div内部的最后面
div.append("Last
"); // now: First
lorem ipsum
Last
logger.info("now div={}", div);
Element span = doc.select("span").first(); // One
// 将span节点封装到html最里面 --》 One
span.wrap(" ");
logger.info("doc={}", doc);
}