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

目录

一、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
    }
}

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值