文章目录
Jsoup HTML解析器
在解析一个页面的时候,虽然也能通过字符串的工具类、正则表达式等技术手段处理达到效果。但是怎么也不比专业的工具给力啊!
Jsoup就是一款专门用来解析HTML文档的工具。并且Jsoup的使用方式和JQuery类似。
Jsoup介绍
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
(以上内容来自百度百科)
- Jsoup主要功能:
- 从
URL/文件/字符串中解析HTML文档。 - 使用
DOM/CSS选择器解析出数据。 - 可以操作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的直接子元素,仅一层 -
……
1067

被折叠的 条评论
为什么被折叠?



