1.介绍
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
2.功能
jsoup的主要功能如下:
-
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
3.使用
先加入Jsoup依赖(可从maven仓库获取:https://mvnrepository.com/):
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
1)解析url
@Test
public void testUrl() throws Exception{
// 解析url地址
Document document = Jsoup.parse(new URL("https://www.baidu.com"),1000);
// 获取title内容
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
}
2) 解析字符串:
准备:在此之前要自己见创建一个文本文档,内容是一个html页面
@Test
public void testString() throws Exception{
// 使用工具类获取文件 ,转出字符串
String content = FileUtils.readFileToString(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
Document document = Jsoup.parse(content);
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
3)直接解析文件
@Test
public void testFile() throws Exception{
Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
String title = document.getElementsByTag("title").first().text();
System.out.println(title);
}
4)通过dom获取数据
@Test
public void testDOM() throws Exception{
// 解析文件,获取document对象
Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
// 获取元素
// 1.根究id获取
Element element = document.getElementById("city_bj");
System.out.println("根究id获取:" + element.text());
// 2.根据标签获取
String span = document.getElementsByTag("span").first().text();
System.out.println("根据标签获取:" + span);
// 3. 根据class获取
String classAAndB = document.getElementsByClass("class_a class_b").first().text();
System.out.println("根据所有class获取:"+ classAAndB);
String classA = document.getElementsByClass("class_a").first().text();
System.out.println("根据class_a获取:"+ classA);
String classB = document.getElementsByClass("class_b").first().text();
System.out.println("根据class_b获取:" + classB);
// 根据属性获取
String abc = document.getElementsByAttribute("abc").first().text();
System.out.println("根据属性获取:" + abc);
// 根据属性和属性值获取
String attr = document.getElementsByAttributeValue("href","http://sh.itcast.cn").first().text();
System.out.println("根据属性和属性值获取:" + attr);
}
5)根据选择器获取数据
@Test
public void testSelector() throws Exception{
// 解析文件,获取document对象
Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
// 通过标签获取元素
Elements elements = document.select("span");
for (Element element : elements) {
System.out.println("根据class查找:"+element.text());
}
// 根据id查找
Elements elements1 = document.select("#city_bj");
for (Element element : elements1) {
System.out.println("根据id查找:"+element.text());
}
// 根据class查找
Elements elements2 = document.select(".class_a");
for (Element element : elements2) {
System.out.println("根据class查找:"+element.text());
}
// 根据属性查找
Elements elements3 = document.select("[abc]");
for (Element element : elements3) {
System.out.println("根据属性查找:"+element.text());
}
// 根据属性和属性值查找
Elements elements4 = document.select("[class=s_name]");
for (Element element : elements4) {
System.out.println("根据属性和属性值查找:"+element.text());
}
}
6)组合使用选择器
/**
* 选择器组合使用
* @throws Exception
*/
@Test
public void testSelector2() throws Exception{
// 解析文件,获取document对象
Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
// 元素+id
Element element = document.select("h3#city_bj").first();
System.out.println("元素+id:"+element.text());
// 元素+class
Element element1 = document.select("li.class_a").first();
System.out.println("元素+class:"+element1.text());
// 元素+属性名
Element element2 = document.select("span[abc]").first();
System.out.println("元素+属性名:"+element2.text());
// 任意组合,比如:span[abc].s_name
Element element3 = document.select("span[abc].s_name").first();
System.out.println("任意组合:"+element3.text());
//parent > child: 查找某个父元素下的直接子元素,
//比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
Element element4 = document.select(".city_con > ul > li").first();
System.out.println("直接子元素:"+element4.text());
//parent > * 查找某个父元素下所有直接子元素.city_con > *
Elements elements = document.select(".city_con > *");
for (Element element5 : elements) {
System.out.println("直接所有子元素:"+element5.text());
}
}