我们抓取到页面后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些技术都会带来很大的开发成本,所以我们需要一款专门解析html页面的技术。
jsoup是一款java的html解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似Jquery的操作方法来取出和操作数据。
jsoup的主要功能如下:
-
从一个URL,文件或者字符串中解析HTML
-
使用DOM或CSS选择器来查找、取出数据
-
可操作HTML元素、属性、文本
(1)加入pom依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
(2)解析url
@Test
public void testUrl() throws Exception {
//解析URL地址
Document doc= Jsoup.parse(new URL("https://movie.douban.com"),1000);
//获取第一个title标签内的内容
String title=doc.getElementsByTag("title").first().text();
System.out.println(title);
}
虽然使用jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等方式,而jsoup对这些的支持不是很好,所以我们一般只把jsoup当做html解析工具使用
(3)解析字符串
这里我们将豆瓣电影250的网站html保存下来,然后利用commons-io包的工具类获取该html的字符串
@Test
public void testString() throws Exception {
//使用工具类读取文件,获取字符串
String content = FileUtils.readFileToString(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
//解析字符串
Document doc = Jsoup.parse(content);
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
(4)解析文件
@Test
public void testFile() throws Exception{
//解析文件
Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
}
(5)使用dom方式遍历文档
| 功能 | 方法 |
|---|---|
| 根据id查询元素 | getElementById |
| 根据标签获取元素 | getElementsByTag |
| 根据class获取元素 | getElementsByClass |
| 根据属性获取元素 | getElementsByAttribute |
@Test
public void testDom() throws Exception{
//解析文件
Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
//1.根据id获取元素
String element = doc.getElementById("content").text();
System.out.println(element);
//2.根据标签获取元素
String title = doc.getElementsByTag("title").first().text();
System.out.println(title);
//3.根据class获取元素
String element2 = doc.getElementsByClass("inp-btn").first().text();
System.out.println(element2);
//4.根据属性获取元素
String element3 = doc.getElementsByAttribute("href").first().text();
System.out.println(element3);
String element4 = doc.getElementsByAttributeValue("href","https://movie.douban.com/subject/1292052/").text();
System.out.println(element4);
}
(6)从元素中获取数据
@Test
public void testData() throws Exception {
//解析文件
Document doc = Jsoup.parse(new File("C:\\Users\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
//根据id获取数据
Element element = doc.getElementById("top-nav-appintro");
String str = "";
//1.从元素中获取Id
str = element.id();
System.out.println(str);
//2.从元素中获取className
str = element.className();
System.out.println(str);
Set<String> classSet = element.classNames();
for (String s : classSet) {
System.out.println(s);
}
//3.从元素中获取属性的值
String id = element.attr("class ");
//4.从元素中获取所有属性
Attributes attributes = element.attributes();
System.out.println(attributes.toString());
//5.从元素中获取文本内容text
str = element.text();
System.out.println(str);
}
(7)Selector选择器
| 功能 | 语法 |
|---|---|
| 通过标签查找元素 | tagname |
| 通过Id查找元素 | #id |
| 通过class名称查找元素 | .class |
| 通过属性查找元素 | [attribute] |
| 通过属性值查找元素 | [attr=value] |
@Test
public void testSelector() throws Exception{
//解析文件
Document doc = Jsoup.parse(new File("C:\\Users\\杨峰宇\\Desktop\\学习\\豆瓣电影 Top 250.html"), "utf8");
//通过标签查找元素
Elements elements = doc.select("span");
for (Element element : elements) {
System.out.println(element.text());
}
System.out.println("==================");
//通过id查找元素,比如#id
Elements elements1 = doc.select("#top-nav-appintro");
System.out.println(elements1.first().text());
System.out.println("==================");
//通过class元素查找元素,比如.class
Elements elements2 = doc.select(".inp-btn");
for (Element element : elements2) {
System.out.println(element.text());
}
System.out.println("==================");
//通过属性查找元素,比如[abc]
Elements elements3 = doc.select("[href]");
for (Element element : elements3) {
System.out.println(element.text());
}
System.out.println("==================");
//通过属性值来查找元素,比如[abc=123]
Elements elements4 = doc.select("[class=pic]");
for (Element element : elements4) {
System.out.println(element.text());
}
}
本文介绍jsoup,一款用于Java的HTML解析库。它能从URL、文件或字符串中解析HTML,提供DOM、CSS选择器及类似JQuery的操作方法。文章详细讲解了如何使用jsoup进行URL解析、字符串解析、文件解析,以及如何使用DOM和选择器获取数据。
1694

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



