目录

​​一、Jsoup概述​​

​​1、简介​​

​​2、主要功能​​

​​二、解析三种数据源​​

​​1、解析Url​​

​​2、解析字符串​​

​​3、解析文件​​

​​三、使用DOM方式获取数据​​

​​1、获取元素常用的四种的方法​​

​​2、代码演示:​​

​​四、获取元素中的内容​​

​​1、常用的功能​​

​​2、代码演示​​

​​五、使用选择器语法查找元素​​

​​1、概述​​

​​2、常用功能​​

​​3、代码演示​​

​​六、组合使用选择器语法查找元素​​

​​1、常用组合​​

​​2、代码演示​​


一、Jsoup概述

1、简介

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

 

2、主要功能

(1)从一个URL,文件或字符串中解析HTML;

(2)可操作HTML元素、属性、文本;

(3)使用DOM或CSS选择器来查找、取出数据;

 

二、解析三种数据源

1、解析Url

@Test
//通过url获取文档并解析
public void testParseUrl() throws Exception {
//1、获取网页存入文档
//1.1 写法1
Document document = Jsoup.connect("http://www.baidu.com").get();
//1.2 写法2
//Document document = Jsoup.parse(new URL("http://www.baidu.com"), 1000);
//2、解析网页,通过标签获取title元素
Element title = document.getElementsByTag("title").first();
//3、通过title元素获取title标签内部文字,并打印
System.out.println(title.text());//百度一下,你就知道
}

问题说明:Jsoup可以直接抓取文档,为什么还要用HttpClent呢?

答:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用。

 

2、解析字符串

@Test
//解析字符串
public void testParseString(){
//1、创建字符串
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
//2、将字符串解析为文档
Document document = Jsoup.parse(html);
//3、通过标签获取title元素
Element title = document.getElementsByTag("title").first();
//4、通过title元素获取title标签内部文字,并打印
System.out.println(title.text());//First parse
}

 

3、解析文件

@Test
//解析文件
public void testParseFile() throws Exception {
//1、获取文件存入文档
Document document = Jsoup.parse(new File("C:\\Users\\Administrator\\Desktop\\html.txt"), "utf8");
//2、通过标签获取title元素
Element title = document.getElementsByTag("title").first();
//3、通过title元素获取title标签内部文字,并打印
System.out.println(title.text());//First parse
}

文件内容:

<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>

 

三、使用DOM方式获取数据

1、获取元素常用的四种的方法

1、根据id查询元素getElementById

2、根据标签获取元素getElementsByTag

3、根据class获取元素getElementsByClass

4、根据属性获取元素getElementsByAttribute

 

2、代码演示:

package com.zb.crawler.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

//通过DOM等的方式获取元素
public class TestGetElement {
@Test
//通过DOM的方式获取元素
public void testDom(){
//1、创建html字符串
String html = "<!DOCTYPE html>\n" +
"<html>\n" +
"\t<head>\n" +
"\t\t<meta charset=\"utf-8\">\n" +
"\t\t<title>我是通过标签获取的标题</title>\n" +
"\t</head>\n" +
"\t<body>\n" +
"\t\t<h1 id=\"h1\">我是根据ID获取的H1</h1>\n" +
"\t\t<h2 class=\"h2\">我是根据CLASS获取的H2</h2>\n" +
"\t\t<h3 align=\"center\">我是根据属性获取的H3</h3>\n" +
"\t</body>\n" +
"</html>\n";
//2、解析字符串为文档
Document document = Jsoup.parse(html);
//3、根据id查询元素getElementById
Element h1 = document.getElementById("h1");
System.out.println(h1.text());
//4、根据标签获取元素getElementsByTag
Elements title = document.getElementsByTag("title");
System.out.println(title.text());
//5、根据class获取元素getElementsByClass
Elements h2 = document.getElementsByClass("h2");
System.out.println(h2.text());
//6、根据属性获取元素getElementsByAttribute
Elements align = document.getElementsByAttribute("align");
System.out.println(align.text());
//我是根据ID获取的H1
//我是通过标签获取的标题
//我是根据CLASS获取的H2
//我是根据属性获取的H3
}
}

 

四、获取元素中的内容

1、常用的功能

1.从元素中获取id

2.从元素中获取className

3.从元素中获取属性的值attr

4.从元素中获取所有属性attributes

5.从元素中获取文本内容text

 

2、代码演示

package com.zb.crawler.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.junit.Test;

//获取元素的内容
public class TestGetElementContent {
@Test
//通过DOM的方式获取元素
public void testDom(){
//1、创建html字符串
String html = "<!DOCTYPE html>\n" +
"<html>\n" +
"\t<head>\n" +
"\t\t<meta charset=\"utf-8\">\n" +
"\t\t<title>我是标题</title>\n" +
"\t</head>\n" +
"\t<body>\n" +
"\t\t<h1 id=\"h1_id\" class=\"h1_class\" align=\"center\">我是H1,我有很多属性</h4>\n" +
"\t</body>\n" +
"</html>";
//2、解析字符串为文档
Document document = Jsoup.parse(html);
//3、根据id查询元素getElementById
Element h1 = document.getElementById("h1_id");
//4、从元素中获取id
String id = h1.id();
System.out.println(id);
//5、从元素中获取className
String className = h1.className();
System.out.println(className);
//6、从元素中获取属性的值attr
String align = h1.attr("align");
System.out.println(align);
//7、从元素中获取所有属性attributes
Attributes attributes = h1.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getValue());
}
//8、从元素中获取文本内容text
String text = h1.text();
System.out.println(text);
//h1_id
//h1_class
//center
//h1_id
//h1_class
//center
//我是H1,我有很多属性
}
}

 

五、使用选择器语法查找元素

1、概述

Jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

 

2、常用功能

tagname:通过标签查找元素,比如:span

#id:通过ID查找元素,比如:# city_bj

.class:通过class名称查找元素,比如:.class_a

[attribute]:利用属性查找元素,比如:[abc]

[attr=value]:利用属性值来查找元素,比如:[class=s_name]

 

3、代码演示

package com.zb.crawler.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

public class TestGetElementBySelector {
@Test
public void testSelector(){
//1、创建html字符串
String html = "<!DOCTYPE html>\n" +
"<html>\n" +
"\t<head>\n" +
"\t\t<meta charset=\"utf-8\">\n" +
"\t\t<title>我是通过标签获取的标题</title>\n" +
"\t</head>\n" +
"\t<body>\n" +
"\t\t<h1 id=\"h1\">我是根据ID获取的H1</h1>\n" +
"\t\t<h2 class=\"h2\">我是根据CLASS获取的H2</h2>\n" +
"\t\t<h3 align=\"center\">我是根据属性(和属性值)获取的H3</h3>\n" +
"\t\t<h4 align=\"center\">我是根据属性和属性值获取的H4</h4>\n" +
"\t</body>\n" +
"</html>";
//2、解析字符串为文档
Document document = Jsoup.parse(html);
//3、tagName:通过标签查找元素
Elements title = document.select("title");
System.out.println(title.text());
//4、#id:通过ID查找元素,注意ID都是唯一的
Element h1 = document.select("#h1").first();
System.out.println(h1.text());
//5、.class:通过class名称查找元素
Element h2 = document.select(".h2").first();
System.out.println(h2.text());
//6、[attribute]:利用属性查找元素
Elements align = document.select("[align]");
for (Element element : align) {
System.out.println(element.text());
}
//7、[attr=value]:利用属性值来查找元素
Elements elements = document.select("[align=center]");
for (Element element : elements) {
System.out.println(element.text());
}
//我是通过标签获取的标题
//我是根据ID获取的H1
//我是根据CLASS获取的H2
//我是根据属性(和属性值)获取的H3
//我是根据属性和属性值获取的H4
//我是根据属性(和属性值)获取的H3
//我是根据属性和属性值获取的H4
}
}

 

六、组合使用选择器语法查找元素

1、常用组合

el#id:元素+ID,比如:h3#city_bj;

el.class:元素+class,比如:li.class_a;

el[attr]:元素+属性名,比如:span[abc];

任意组合:比如:span[abc].s_name;

ancestor child:查找某个元素下子元素,比如:.city_con li 查找"city_con"下的所有li;

parent > child:查找某个父元素下的直接子元素,比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li;

parent > *:查找某个父元素下所有直接子元素;

 

2、代码演示

package com.zb.crawler.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

public class TestGetElementBySelectorGroup {
@Test
public void testSelector(){
//1、创建html字符串
String html = "<!DOCTYPE html>\n" +
"<html>\n" +
"\t<head>\n" +
"\t\t<meta charset=\"utf-8\">\n" +
"\t\t<title>我是通过标签获取的标题</title>\n" +
"\t</head>\n" +
"\t<body>\n" +
"\t\t<h1 id=\"h1\">我是根据ID获取的H1</h1>\n" +
"\t\t<h1 id=\"h11\">我是根据ID获取的H11</h1>\n" +
"\t\t<h2 class=\"h2\">我是根据CLASS获取的H2</h2>\n" +
"\t\t<h2 class=\"h22\">我是根据CLASS获取的H22</h2>\n" +
"\t\t<h3 align=\"center\">我是根据属性(和属性值)获取的H3</h3>\n" +
"\t\t<h4 align=\"center\">我是根据属性和属性值获取的H4</h4>\n" +
"\t\t<div>\n" +
"\t\t\t<h1>我是div下的h1</h1>\n" +
"\t\t\t<ul>\n" +
"\t\t\t\t<li>大哥</li>\n" +
"\t\t\t\t<li>二哥</li>\n" +
"\t\t\t\t<li>三哥</li>\n" +
"\t\t\t\t<li>四哥</li>\n" +
"\t\t\t\t<li><h1>我是div下的ul下的li下的的h1</h1></li>\n" +
"\t\t\t</ul>\n" +
"\t\t</div>\n" +
"\t</body>\n" +
"</html>";
//2、解析字符串为文档
Document document = Jsoup.parse(html);
//3、el#id:元素+ID
Element h11 = document.select("h1#h11").first();
System.out.println(h11.text());
//4、el.class:元素+class
Element h22 = document.select("h2.h22").first();
System.out.println(h22.text());
//5、el[attr]:元素+属性名
Element h3align = document.select("h3[align]").first();
System.out.println(h3align.text());
//6、任意组合
Element h3AlignIsCenter = document.select("h3[align=center]").first();
System.out.println(h3AlignIsCenter.text());
//7、ancestor child:查找某个元素下子元素
Elements div_li = document.select("div h1");
for (Element element : div_li) {
System.out.println(element.text());
}
//8、parent > child:查找某个父元素下的直接子元素
Element childH1 = document.select("div > ul > li > h1").first();
System.out.println(childH1.text());
//9、parent > *:查找某个父元素下所有直接子元素
Elements elements = document.select("div > *");
for (Element element : elements) {
System.out.println(element.text());
}
//我是根据ID获取的H11
//我是根据CLASS获取的H22
//我是根据属性(和属性值)获取的H3
//我是根据属性(和属性值)获取的H3
//我是div下的h1
//我是div下的ul下的li下的的h1
//我是div下的ul下的li下的的h1
//我是div下的h1
//大哥 二哥 三哥 四哥 我是div下的ul下的li下的的h1
}
}