Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Java爬虫】002-Jsoup学习笔记

【Java爬虫】002-Jsoup学习笔记

作者头像
訾博ZiBo
发布于 2025-01-06 07:11:29
发布于 2025-01-06 07:11:29
7800
代码可运行
举报
运行总次数:0
代码可运行

一、Jsoup概述

1、简介

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

2、主要功能

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

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

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

二、解析三种数据源

1、解析Url

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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、解析字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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、解析文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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
    }

文件内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>

三、使用DOM方式获取数据

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、根据id查询元素getElementById

2、根据标签获取元素getElementsByTag

3、根据class获取元素getElementsByClass

4、根据属性获取元素getElementsByAttribute
2、代码演示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、常用的功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.从元素中获取id

2.从元素中获取className

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

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

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

2、代码演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、代码演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、代码演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验