maven工程需要引入:
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
Java代码
package com.itoss.crawler;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
public class JsoupTest {
@Test
public void parseHtmlString() {
//从字符串中分析文档
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
System.out.println(doc.html());
}
@Test
public void parseHtmlFragment() {
//分析正文片段
String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
System.out.println(body.html());
}
@Test
public void parseUrl() {
//从 URL 加载文档
Document doc = null;
try {
doc = Jsoup.connect("https://www.baidu.com/").get();
System.out.println(doc.html());
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void parseFile() {
//从文件加载文档
File file = new File("C:\\Users\\juun\\Desktop\\ani.html");
try {
Document doc = Jsoup.parse(file, "utf8");
System.out.println(doc.html());
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void docParse(){
//document解析
File file = new File("C:\\Users\\juun\\Desktop\\ani.html");
try {
Document doc = Jsoup.parse(file, "utf8");
System.out.println(doc.getElementById("id1").text());
System.out.println(doc.getElementsByClass("bounceInLeft").get(0).text());
System.out.println(doc.getElementsByAttribute("idname").get(0).text());
System.out.println(doc.getElementsByAttributeValue("class", "animated bounceInRight").get(0).text());
System.out.println(doc.getElementsByTag("h1").get(0).text());
System.out.println(doc.getElementsByTag("h1").get(0).className());
System.out.println(doc.getElementsByTag("h1").get(0).attr("id"));
System.out.println(doc.getElementsByTag("h1").get(0).html());
/*
查找元素
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key)(及相关方法)
元素同级:, 、 、 、,siblingElements()firstElementSibling()lastElementSibling()nextElementSibling()previousElementSibling()
图:parent()children()child(int index)
元素数据
attr(String key)获取和设置属性attr(String key, String value)
attributes()获取所有属性
id()和className()classNames()
text()获取和设置文本内容text(String value)
html()获取和设置内部 HTML 内容html(String value)
outerHtml()获取外部 HTML 值
data()获取数据内容(例如 和 标记)scriptstyle
tag()和tagName()
操作 HTML 和文本
append(String html),prepend(String html)
appendText(String text),prependText(String text)
appendElement(String tagName),prependElement(String tagName)
html(String value)
*/
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void docSelect(){
//select选择器解析
File file = new File("C:\\Users\\juun\\Desktop\\ani.html");
try {
Document doc = Jsoup.parse(file, "utf8");
System.out.println(doc.select("#id1").get(0).text());
System.out.println(doc.select(".bounceInLeft").get(0).text());
System.out.println(doc.select("h1").get(0).text());
System.out.println(doc.select("h3>span").get(0).text());
System.out.println(doc.select("h1.bounceInLeft").get(0).text());
System.out.println(doc.select("h1[idname]").get(0).text());
/*
选择器概述
tagname:按标记查找元素,例如a
ns|tag:在命名空间中按标记查找元素,例如 查找元素fb|name<fb:name>
#id:按 ID 查找元素,例如#logo
.class:按类名查找元素,例如.masthead
[attribute]:具有属性的元素,例如[href]
[^attr]:具有属性名称前缀的元素,例如 查找具有 HTML5 数据集属性的元素[^data-]
[attr=value]:具有属性值的元素,例如 (也可配额, 如[width=500][data-name='launch sequence'])
[attr^=value],:具有以值开始、以值结束或包含值的属性的元素,例如[attr$=value][attr*=value][href*=/path/]
[attr~=regex]: 具有与正则表达式匹配的属性值的元素;例如.img[src~=(?i)\.(png|jpe?g)]
*:所有元素,例如*
选择器组合
el#id:具有 ID 的元素,例如div#logo
el.class:具有类的元素,例如div.masthead
el[attr]:具有属性的元素,例如a[href]
任何组合,例如a[href].highlight
ancestor child:来自祖先的子元素,例如 在具有类"正文"的块下查找元素.body pp
parent > child:直接从父元素降代的元素,例如 查找元素;并找到身体标签的直接子项div.content > ppbody > *
siblingA + siblingB:查找与同级 B 元素的子级 B 元素,例如,查找同级 B 元素。div.head + div
siblingA ~ siblingX: 查找同级 X 元素,前面是同级 A,例如h1 ~ p
el, el, el:对多个选择器进行分组,查找匹配任何选择器的唯一元素;例如.div.masthead, div.logo
伪选择器
:lt(n):查找其同级索引(即其在 DOM 树中相对于其父级的位置)小于 的元素。例如.ntd:lt(3)
:gt(n):查找同级索引大于 的元素。例如.ndiv p:gt(2)
:eq(n):查找其同级索引等于 的元素。例如.nform input:eq(1)
:has(selector):查找包含与选择器匹配的元素的元素;例如.div:has(p)
:not(selector):查找与选择器不匹配的元素;例如.div:not(.logo)
:contains(text):查找包含给定文本的元素。搜索不区分大小写;例如.p:contains(jsoup)
:containsOwn(text):查找直接包含给定文本的元素
:matches(regex):查找其文本与指定的正则表达式匹配的元素;例如.div:matches((?i)login)
:matchesOwn(regex):查找其自己的文本与指定的正则表达式匹配的元素
请注意,上述索引伪选择器基于 0,也就是说,第一个元素位于索引 0,第二个元素位于 1,等等
*/
} catch (IOException e) {
e.printStackTrace();
e.printStackTrace();
}
}
}