html页面解析技术之Jsoup的基本使用

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 html页面解析技术之Jsoup的基本使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Jsoup的基本使用

概述

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

可用于爬虫领域,爬虫抓取页面后,需要对页面进行解析,就可以使用Jsoup这种专门解析html页面的技术。

GitHub地址:https://github.com/jhy/jsoup/

主要功能

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

2.使用DOM或CSS选择器来查找、取出数据

3.可操作HTML元素、属性、文本

添加依赖

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.15.2</version>
        </dependency>

创建html测试文件

添加IO包,用于读取html文件

	 <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

创建test.html文件,用于解析测试。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="myDiv" class="myDivClass1 myDivClass2" myTag="1">
    <h2 id="title">根据id查询元素</h2>
    <span>根据标签获取元素</span>
    <div class="myClass">根据class获取元素</div>
    <span myTag="1">根据属性获取元素1</span>
    <span myTag="2">根据属性获取元素2</span>
</div>
</div>
</body>
</html>

解析URL

发起请求并获取数据,封装为Document对象

    @Test
    public void parseUrl() throws Exception {
        /**
         * 解析url地址
         * URL url:访问的url
         * int timeoutMillis:访问超时时间
         */
        Document doc = Jsoup.parse(new URL("http://www.baidu.com"), 5000);
        // 使用标签选择器,获取title标签中的内容
        String title = doc.getElementsByTag("title").first().text();
        log.info("title={}", title);
    }

解析字符串

读取一个HTML文件,获取字符串,直接输入字符串,并封装为Document对象

    @Test
    public void parseString() throws IOException {
        // 使用工具类读取文件,获取字符串
        String content = FileUtils.readFileToString(new File("D:\\test.html"), "utf8");
        // 解析字符串
        Document doc = Jsoup.parse(content);
        String title = doc.getElementsByTag("title").first().text();
        log.info("title={}", title);
    }

解析文件

直接解析一个HTML文件,并封装为Document对象

    @Test
    public void parseFile() throws Exception {
        // 解析文件
        Document doc = Jsoup.parse(new File("D:\\test.html"), "utf8");
        String title = doc.getElementsByTag("title").first().text();
        log.info("title={}", title);
    }

使用dom遍历文档

1.获取元素

1.根据id查询元素getElementById

2.根据标签获取元素getElementsByTag

3.根据class获取元素getElementsByClass

4.根据属性获取元素getElementsByAttribute

    @Test
    public void parseDOM() throws Exception {
        // 解析文件,获取Document对象
        Document doc = Jsoup.parse(new File("D:\\test.html"), "utf8");

        // 根据id查询元素getElementById
        Element element1 = doc.getElementById("title");
        log.info("element1={}", element1);

        // 根据标签获取元素getElementsByTag
        Element element2 = doc.getElementsByTag("span").first();
        log.info("element2={}", element2);

        // 根据class获取元素getElementsByClass
        Element element3 = doc.getElementsByClass("myClass").first();
        log.info("element3={}", element3);


        // 根据属性获取元素getElementsByAttribute
        Element element4 = doc.getElementsByAttribute("myTag").first();
        log.info("element4={}", element4);

        Element element5 = doc.getElementsByAttributeValue("myTag", "2").first();
        log.info("element5={}", element5);
    }
20:08:37.918 [main] INFO com.example.demo.test.JsoupFirstTest - element1=<h2 id="title">根据id查询元素</h2>
20:08:37.923 [main] INFO com.example.demo.test.JsoupFirstTest - element2=<span>根据标签获取元素</span>
20:08:37.923 [main] INFO com.example.demo.test.JsoupFirstTest - element3=<div class="myClass">
 根据class获取元素
</div>
20:08:37.924 [main] INFO com.example.demo.test.JsoupFirstTest - element4=<span mytag="1">根据属性获取元素1</span>
20:08:37.924 [main] INFO com.example.demo.test.JsoupFirstTest - element5=<span mytag="2">根据属性获取元素2</span>

2.获取元素中的数据

1.从元素中获取id

2.从元素中获取className

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

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

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

	@Test
    public void parseData() throws Exception {
        // 解析文件,获取Document对象
       Document doc = Jsoup.parse(new File("D:\\test.html"), "utf8");

        // 根据id获取元素
        Element element = doc.getElementById("myDiv");

        // 从元素中获取id
        String id = element.id();
        log.info("id={}", id);

        // 从元素中获取className
        String className = element.className();
        log.info("className={}", className);

        // 循环得到的className集合
        Set<String> classSet = element.classNames();
        for (String s : classSet) {
            log.info("className={}", s);
        }

        // 从元素中获取属性的值attr
        String attr = element.attr("myTag");
        log.info("attr={}", attr);

        // 从元素中获取所有属性attributes
        Attributes attributes = element.attributes();
        List<Attribute> attributesList = attributes.asList();
        for (Attribute attribute : attributesList) {
            log.info("attribute={}", attribute);
        }

        // 从元素中获取文本内容text
        String text = element.text();
        log.info("text={}", text);
    }
20:15:06.628 [main] INFO com.example.demo.test.JsoupFirstTest - id=myDiv
20:15:06.632 [main] INFO com.example.demo.test.JsoupFirstTest - className=myDivClass1 myDivClass2
20:15:06.632 [main] INFO com.example.demo.test.JsoupFirstTest - className=myDivClass1
20:15:06.632 [main] INFO com.example.demo.test.JsoupFirstTest - className=myDivClass2
20:15:06.632 [main] INFO com.example.demo.test.JsoupFirstTest - attr=1
20:15:06.633 [main] INFO com.example.demo.test.JsoupFirstTest - attribute=id="myDiv"
20:15:06.634 [main] INFO com.example.demo.test.JsoupFirstTest - attribute=class="myDivClass1 myDivClass2"
20:15:06.634 [main] INFO com.example.demo.test.JsoupFirstTest - attribute=mytag="1"
20:15:06.635 [main] INFO com.example.demo.test.JsoupFirstTest - text=根据id查询元素 根据标签获取元素 根据class获取元素 根据属性获取元素1 根据属性获取元素2

选择器查找元素

jsoup的elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。

select方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

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

选择器 描述 举例
tagname 通过标签元素 span
#id 通过ID查找元素 #myId
.class 通过class名称查找元素 .myClass
[attribute] 利用属性查找元素 [myTag]
[attribute=value] 利用属性值来查找元素 [myTag=1]
    @Test
    public void parseSelector() throws Exception {
        // 解析文件,获取Document对象
        Document doc = Jsoup.parse(new File("D:\\test.html"), "utf8");

        // tagname: 通过标签查找元素,比如:span
        Elements elements = doc.select("span");
        for (Element element : elements) {
            log.info("element={}", element);
            log.info("----------------------------------------------------");
        }

        // #id: 通过ID查找元素
        Element id = doc.select("#title").first();
        log.info("id={}", id);
        log.info("----------------------------------------------------");

        // .class: 通过class名称查找元素
        Element classs = doc.select(".myClass").first();
        log.info("classs={}", classs);
        log.info("----------------------------------------------------");

        // [attribute]: 利用属性查找元素
        Element myTag = doc.select("[myTag]").first();
        log.info("myTag={}", myTag);
        log.info("----------------------------------------------------");

        //[attr=value]: 利用属性值来查找元素
        Elements myTag1 = doc.select("[myTag=1]");
        for (Element element : myTag1) {
            log.info("element={}", element);
        }
    }
20:19:25.247 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span>根据标签获取元素</span>
20:19:25.251 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.251 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="1">根据属性获取元素1</span>
20:19:25.252 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.252 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="2">根据属性获取元素2</span>
20:19:25.252 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.252 [main] INFO com.example.demo.test.JsoupFirstTest - id=<h2 id="title">根据id查询元素</h2>
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - classs=<div class="myClass">
 根据class获取元素
</div>
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - myTag=<div id="myDiv" class="myDivClass1 myDivClass2" mytag="1">
 <h2 id="title">根据id查询元素</h2> <span>根据标签获取元素</span>
 <div class="myClass">
  根据class获取元素
 </div> <span mytag="1">根据属性获取元素1</span> <span mytag="2">根据属性获取元素2</span>
</div>
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - element=<div id="myDiv" class="myDivClass1 myDivClass2" mytag="1">
 <h2 id="title">根据id查询元素</h2> <span>根据标签获取元素</span>
 <div class="myClass">
  根据class获取元素
 </div> <span mytag="1">根据属性获取元素1</span> <span mytag="2">根据属性获取元素2</span>
</div>
20:19:25.253 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="1">根据属性获取元素1</span>

Selector选择器组合

选择器 描述 举例
el#id 元素+ID h1#myId
el.class 元素+class li.myClass
el[attr] 元素+属性名 span[myTag]
ancestor child 查找某个元素下子元素 #myId p
parent > child 查找某个父元素下的直接子元素 #myId>p
parent > * 查找某个父元素下所有直接子元素 #myId > *
    @Test
    public void parseSelector2() throws Exception {
        // 解析文件,获取Document对象
         Document doc = Jsoup.parse(new File("D:\\test.html"), "utf8");

        // el#id: 元素+ID
        Element element1 = doc.select("div#myDiv").first();
        log.info("element1={}", element1);
        log.info("----------------------------------------------------");

        // el.class: 元素+class
        Element element2 = doc.select("div.myClass").first();
        log.info("element2={}", element2);
        log.info("----------------------------------------------------");

        //el[attr]: 元素+属性名
        Element element3 = doc.select("span[myTag]").first();
        log.info("element3={}", element3);
        log.info("----------------------------------------------------");

        // ancestor child: 查找某个元素下子元素
        Elements elements1 = doc.select("#myDiv span");
        for (Element element : elements1) {
            log.info("element={}", element);
        }
        log.info("----------------------------------------------------");

        // parent > child: 查找某个父元素下的直接子元素
        Elements elements2 = doc.select("#myDiv>h2");
        for (Element element : elements2) {
            log.info("element={}", element);
        }
        log.info("----------------------------------------------------");

        // parent > *: 查找某个父元素下所有直接子元素
        Elements elements3 = doc.select("#myDiv>*");
        for (Element element : elements3) {
            log.info("element={}", element);
        }
    }
20:23:17.938 [main] INFO com.example.demo.test.JsoupFirstTest - element1=<div id="myDiv" class="myDivClass1 myDivClass2" mytag="1">
 <h2 id="title">根据id查询元素</h2> <span>根据标签获取元素</span>
 <div class="myClass">
  根据class获取元素
 </div> <span mytag="1">根据属性获取元素1</span> <span mytag="2">根据属性获取元素2</span>
</div>
20:23:17.944 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:23:17.945 [main] INFO com.example.demo.test.JsoupFirstTest - element2=<div class="myClass">
 根据class获取元素
</div>
20:23:17.945 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:23:17.945 [main] INFO com.example.demo.test.JsoupFirstTest - element3=<span mytag="1">根据属性获取元素1</span>
20:23:17.945 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:23:17.946 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span>根据标签获取元素</span>
20:23:17.946 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="1">根据属性获取元素1</span>
20:23:17.946 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="2">根据属性获取元素2</span>
20:23:17.946 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:23:17.947 [main] INFO com.example.demo.test.JsoupFirstTest - element=<h2 id="title">根据id查询元素</h2>
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - ----------------------------------------------------
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - element=<h2 id="title">根据id查询元素</h2>
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span>根据标签获取元素</span>
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - element=<div class="myClass">
 根据class获取元素
</div>
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="1">根据属性获取元素1</span>
20:24:22.333 [main] INFO com.example.demo.test.JsoupFirstTest - element=<span mytag="2">根据属性获取元素2</span>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136882.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!