jsoup 的主要功能如下:
PS:虽然使用Jsoup可以替代 HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而 Jsoup对这些的支持并不是很好,所以我们一般把 Jsoup仅仅作为Html 解析工具使用
/**
* 从一个 URL 解析 HTML
*/
@Test
public void testUrl() throws Exception{
//解析url地址,第一个参数是访问的url,第二个参数是访问时候的超时时间
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"),1000);
//使用标签选择器,获取title标签中的内容
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
/**
*
* 从一个字符串解析 HTML
*/
@Test
public void testString() throws Exception{
//使用工具类读取文件,获取字符串
String content = FileUtils.readFileToString(new File("index.html"), "utf-8");
// System.out.println(content);
//解析字符串
Document doc = Jsoup.parse(content);
//使用标签选择器,获取title标签中的内容
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
/**
* 从一个文件解析 HTML
*/
@Test
public void testFile() throws Exception{
//解析文件
Document doc = Jsoup.parse(new File("index.html"), "utf-8");
//使用标签选择器,获取title标签中的内容
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
元素获取:
@Test
public void testDom() throws Exception {
//解析url,获取Document对象
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 2000);
// System.out.println(doc.html());
//获取元素
//1. 根据 id 查询元素 getElementByld
Element element = doc.getElementById("webimclosebutton");
//2. 根据标签获取元素 getElementsByTag
//Element element = doc.getElementsByTag("span").first();
//3. 根据 class 获取元素 getElementsByclass
//Element element = doc.getElementsByClass("itcast_click").first();//一个属性多个class 写一个,写完整都可以
//打印元素的内容
if (element != null) {
System.out.println(element);
System.out.println(element.text());
}
}
@Test
public void testAttribute() throws Exception{
//解析url,获取Document对象
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 2000);
//<a href="http://bbs.itheima.com/thread-441445-1-1.html" rel="nofollow" target="_blank"><span class="yearncon_vid"><img class="yearningpic" src="http://www.itcast.cn/files/image/201901/20190126140300010.jpg"> <img class="yearningvid" src="/2018czgw/images/other/yearningvid.png"> </span> <span class="yearnspan">[影视制作] 毕业后成功入职名企 </span> </a>
//4. 根据属性获取元素 getElementsByAttribute
//获取所有有 href 属性的元素
Elements href = doc.getElementsByAttribute("href");
// show(href);
//根据属性名和属性值
Elements attributeValue = doc.getElementsByAttributeValue("href", "http://www.miitbeian.gov.cn");
show(attributeValue);
}
private void show(Elements href) {
for (Element element : href) {
System.out.println(element);
}
}
/**
* 所有方法都是select
*/
@Test
public void testSelector() throws Exception {
//解析url,获取Document对象
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 2000);
// tagname:通过标签查找元素,比如:span
Elements elements = doc.select("span");
showElements(elements);
// #id:通过ID查找元素,比如:#city_bj
Elements elements2 = doc.select("#webimclosebutton");//虽然是通过 id 但是这里他返回的依然是一个集合,应为都是同一个方法,他无法区分开始那种
showElements(elements2);
// .class:通过cass名称查找元素,比如:.class_a
Elements elements3 = doc.select(".salaryp");
showElements(elements3);
// [attribute]:利用属性查找元素,比如:[abc]
Elements elements4 = doc.select("[href]");
showElements(elements4);
// [attr=value]:利用属性值来查找元素,比如:[cass= s_name]
Elements elements5 = doc.select("[href=\"https://www.henghost.com/ \"]");
showElements(elements5);
}
private void showElements(Elements elements) {
for (Element element : elements) {
System.out.println(element);
}
System.out.println("------------------------------------");
}
@Test
public void testSelector2() throws Exception {
//解析url,获取Document对象
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 2000);
System.out.println(doc.html());
// el#id:元素+ID,比如:h3#city_bj
Elements elements = doc.select("video#video");//video 标签里面 id 为video的元素
showElements(elements);
// el.class:元素+cass,比如:li.class_a
//<a href="https://www.henghost.com/ " target="_blank">云服务器 </a>
Elements elements2 = doc.select("a.a_gd");//a标签里面 class是a_gd的元
showElements(elements2);
// el[attr]:元素+属性名,比如:span[abc]
Elements elements3 = doc.select("a[href]");//a标签里面有href属性的元素
showElements(elements3);
// 任意组合:比如:span[abc].s_name
Elements elements4 = doc.select("a[href].a_gd");//a标签里面有href属性并且class属性为a_gd的元素
showElements(elements4);
//空格分开
// ancestor child:查找某个元素下子元素,比如:.city_con li 查找 “city_con” 下的所有 li
// 注意中间空格 是所有的元素孙子也算
Elements elements5 = doc.select("li a");//li 下所有的 a 标签
showElements(elements5);
// > 分开
// parent>child:查找某个父元素下的直接子元素,比如:.city_con>ul>li 查找 city_con第一级(直接子元素)的ul,再找所有ul下的第一级 li
Elements elements6 = doc.select("li>a");//li 的直接子元素,子元素必须是 a
showElements(elements6);
// parent>*:查找某个父元素下所有直接子元素
Elements elements7 = doc.select("li>*");//li的所有直接子元素
showElements(elements7);
}
private void showElements(Elements elements) {
for (Element element : elements) {
System.out.println(element);
}
System.out.println("\n------------------------------------\n");
}
注意:组合选择器时不同的选择器之间有些需要空格分开有些不能有空格分开。
@Test
public void test() throws Exception{
//解析url,获取Document对象
Document doc = Jsoup.parse(new URL("http://www.itcast.cn"), 2000);
// 任意组合:比如:span[abc].s_name
Elements elements = doc.select("a[href].a_gd");//a标签里面有href属性并且class属性为a_gd的元素
showElements(elements);
// 任意组合:比如:span[abc].s_name
Elements elements2 = doc.select("a[href] .a_gd");//
showElements(elements2);
Elements elements3 = doc.select("li a");//li 下所有的 a 标签
showElements(elements3);
Elements elements4 = doc.select("lia");//lia标签
showElements(elements4);
}
pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<!--日志打印-->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--网页解析-->
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<!--操作文件的工具类-->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--StringUtils 解析字符串-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>