Jsoup HTML解析器

Jsoup HTML解析器

在解析一个页面的时候,虽然也能通过字符串的工具类、正则表达式等技术手段处理达到效果。但是怎么也不比专业的工具给力啊!

Jsoup就是一款专门用来解析HTML文档的工具。并且Jsoup的使用方式和JQuery类似。

Jsoup介绍

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

以上内容来自百度百科

  • Jsoup主要功能:
    1. URL/文件/字符串中解析HTML文档。
    2. 使用DOM/CSS选择器解析出数据。
    3. 可以操作HTML的属性、文本、元素。(应该很少有人这么用吧!毕竟解析为主)

Jsoup使用环境搭建

如果创建的是Maven项目,可以导入下面几个依赖:

<!--测试工具类-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
</dependency>
    
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<!--Jsoup工具-->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>
    
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<!--IO相关工具类-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
    
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<!--字符串相关工具类-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

如果创建的是Web工程,可以引入以下几个Jar包:

  • commons-lang3-3.4.jar

  • commons-io-2.4.jar

  • junit-4.13.jar

  • jsoup-1.11.3.jar

或者可以直接到网上的Maven仓库中下载其他版本的依赖。

Jsoup解析

URL解析

@Test
public void testUrl() throws IOException {
    //解析URL地址,获取文档
    //param1:URL对象
    //param2:超时时间
    Document document = Jsoup.parse(new URL("http://news.baidu.com/fashion"), 5000);
    //通过文档标签获取标签内的数据
    //获取标签为title的第一个元素,中的文本内容
    String title = document.getElementsByTag("title").first().text();
    //打印的结果就是获取到的文本内容
    System.out.println(title);
}

字符串解析

下面代码的第三行FileUtils就是commons-io包提供的工具类,可以读取文件转成字符串,Jsoup解析读取出的字符串中HTML内容:

@Test
public void testString() throws IOException {
    String sHtml = FileUtils.readFileToString(new File("D:/百度一下,你就知道.html"));
    //解析字符串格式的HTML文档
    Document document = Jsoup.parse(sHtml);
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title); //百度一下,你就知道
}

File文件解析

上面是通过FileUtils工具类读取的文档,Jsoup自己也可以直接通过new File(path)解析出其中内容:

@Test
public void testFile() throws IOException {
    //加载文件解析HTML文档
    Document document = Jsoup.parse(new File("D:/百度一下,你就知道.html"), "utf-8");
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title); //百度一下,你就知道
}

上面就是三种Jsoup解析HTML的方式。

不管通过哪种途径得到document,都需要去获取document中的数据,不然拿到一堆字符串没有任何价值,下面就是Jsoup获取Document中数据的方式!

Jsoup数据获取方式

  • 通过标签获取数据:getElementsByTag(tagName)
  • 通过Id获取数据:getElementById(idName)
  • 通过CLass获取数据:getElementsByClass(className)
  • 通过属性获取数据:getElementsByAttribute(attrName)
  • 通过属性及属性对应的值获取数据:getElementsByAttributeValue(attrName,value)
  • 通过属性及属性包含值获取数据:getElementsByAttributeValueContaining(attrName,containValue)
  • 通过选择器获取:select(cssQuery)
  • ……

Jsoup获取文档数据的方法还有其他。看这些方法的名字和JQuery类似,使用起来应该会比较方便。

写了一个测试的index.html文件,下面就以这个文件为示例展示数据获取方式:

<!DOCTYPE html>
<!-- The filename is index.html-->
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta content="always" name="referrer"><meta name="theme-color" content="#2932e1">

	<title>百度一下,你就知道</title>
</head>
<body>

	<p id="p1" class="pClass">P1内容</p>
	<p id="p2" class="pClass">P2内容</p>
	<p id="p3" class="pClass">P3内容</p>
	<p id="p4" class="pClass">P4内容</p>

	<a id="baidu" href="http://www.baidu.com/" class="aClass">百度一下,你就知道</a>
	<a id="news" href="https://news.baidu.com/" class="aClass">百度新闻</a>
	<a id="bilibili" href="https://www.bilibili.com/" class="aClass">哔哩哔哩</a>

</body>

</html>

通过标签获取数据

@Test
public void testGetTextByTagName() throws IOException {
    //加载document文档
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //获取P标签中的文本内容
    Elements elements = document.getElementsByTag("p");
    for (Element element : elements) {
        System.out.println(element.text());
    }
}

在这里插入图片描述

通过Id获取数据

    @Test
    public void testGetDateById() throws IOException {
        //加载document文档
        Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
        //获取id为baidu的标签中href属性的值以及标签中文本内容
        Element element = document.getElementById("baidu");
        String href = element.attributes().get("href");
        String text = element.text();
        System.out.println(href);
        System.out.println(text);
    }

在这里插入图片描述

通过Class获取数据

@Test
public void testGetDateByClass() throws IOException {
    //加载document文档
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //通过class获取数据
    Elements elements = document.getElementsByClass("pClass");
    for (Element element : elements) {
        System.out.println(element.text());
    }
}

在这里插入图片描述

通过属性获取数据

@Test
public void testGetDateByAttr() throws IOException {
    //加载document文档
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //通过属性获取数据,获取href属性对应的元素中href属性中的值
    Elements elements = document.getElementsByAttribute("href");
    for (Element e : elements) {
        System.out.println(e.attributes().get("href"));
    }
}

在这里插入图片描述

通过选择器获取数据

标签选择器
@Test
public void testSelect() throws IOException {
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //标签选择器:参数,标签
    Elements elementsA = document.select("a");
    for (Element element : elementsA) {
        System.out.println(element.text());
    }
}
类选择器
@Test
public void testSelect() throws IOException {
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //类选择器:参数[ . + 类名]
    Elements elementsClass = document.select(".pClass");
    for (Element element : elementsClass) {
        System.out.println(element.text());
    }
}
id选择器
@Test
public void testSelect() throws IOException {
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //Id选择器:参数[ # + id]
    Element element = document.select("#baidu").first();
    System.out.println(element.text());
}

使用Id选择器有一个需要注意的就是,因为select()方法不能直接识别出使用的是哪一种选择类型,如果输入的是Id返回的仍然是Elements,但是明显地,Id只有一个,所以后面取first()第一个元素。

属性选择器
@Test
public void testSelect() throws IOException {
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //属性选择器:参数,[属性名称]
    Elements elementsAttr = document.select("[href]");
    for (Element ele : elementsAttr) {
        System.out.println(ele.text());
    }
}

需要注意的一个小点就是,属性选择器中的参数要加上[]

@Test
public void testSelect() throws IOException {
    Document document = Jsoup.parse(new File("D:/index.html"), "utf-8");
    //属性选择器:[属性=值]
    Element elementsAttrValue = document.select("[href=http://www.baidu.com/]").first();
    System.out.println(elementsAttrValue.text());
}
组合选择器
  • 元素+Id

    Elements elements = document.select("p#p1");  //元素和Id的组合
    
  • 元素+Class

    Elements elements = document.select("p.pClass");  //元素和Class组合
    
  • 任意组合

    Elements elements = document.select("p[yourself=abc]");  //p元素中包含yourself属性并且值=abc的属性,当然还可以有其他的组合方式
    
  • 元素下(直接)子元素

    Elements elements = document.select("body #p1"); //body元素下面id为p1的子元素
    Elements elements = document.select("body>#p1"); //body元素下面id为p1的直接子元素,仅一层
    
  • ……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白说(๑• . •๑)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值