Jsoup
Posted roadlandscape
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsoup相关的知识,希望对你有一定的参考价值。
jsoup 是一款Java 的html解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML
使用DOM或CSS选择器来查找、取出数据
可操作HTML元素、属性、文本
引入Jsoup依赖:
<!-- Jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </dependency> <!-- 工具 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
Jsoup解析url
@Test public void testJsoupUrl() throws Exception { // 解析url地址 Document document = Jsoup.parse(new URL("https://www.cnblogs.com/roadlandscape/"), 1000); // 获取title内容 String title = document.getElementsByTag("title").first().text(); System.out.println(title); }
PS:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用
Jsoup解析字符串
@Test public void testJsoupString() throws Exception { // 解析字符串 String content = FileUtils.readFileToString(new File("D:\\test.html"), "utf-8"); Document document = Jsoup.parse(content, "utf-8"); // 获取title内容 String title = document.getElementsByTag("title").first().text(); System.out.println(title); }
Jsoup直接解析文件,并封装为Document对象
@Test public void testJsoupFile() throws Exception { // 解析文件 Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8"); // 获取title内容 String title = document.getElementsByTag("title").first().text(); System.out.println(title); }
使用dom方式遍历文档
元素获取:
1.根据id查询元素getElementById
2.根据标签获取元素getElementsByTag
3.根据class获取元素getElementsByClass
4.根据属性获取元素getElementsByAttribute
@Test public void testDOM() throws Exception { Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8"); Element element = document.getElementById("city_bj"); System.out.println(element.text()); Element element2 = document.getElementsByTag("span").first(); System.out.println(element2.text()); Element element3 = document.getElementsByClass("class_a").first(); System.out.println(element3.text()); // Element element4 = document.getElementsByAttribute("abc").first(); Element element4 = document.getElementsByAttributeValue("abc", "123").first(); System.out.println(element4.text()); }
元素中获取数据:
1.从元素中获取id
2.从元素中获取className
3.从元素中获取属性的值attr
4.从元素中获取所有属性attributes
5.从元素中获取文本内容text
@Test public void testData() throws Exception { Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8"); Element element = document.getElementById("test"); String id = element.id(); System.out.println(id); String className = element.className(); System.out.println(className); // "class_a class_b" Set<String> set = element.classNames(); for (String s : set) { System.out.println(s); } // class_a // class_b String attr = element.attr("id"); System.out.println(attr); Attributes attributes = element.attributes(); System.out.println(attributes.toString()); // id="test" class="class_a class_b" String text = element.text(); System.out.println(text); }
使用选择器语法查找元素:
@Test public void testSelector() throws Exception { Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8"); Elements elements = document.select("span"); for (Element element : elements) { System.out.println(element.text()); } Element element = document.select("#test").first(); System.out.println(element.text()); Element element1 = document.select(".class_a").first(); System.out.println(element1.text()); Element element2 = document.select("[abc]").first(); System.out.println(element2.text()); Elements elements2 = document.select("[class=s_name]"); for (Element e : elements2) { System.out.println(e.text()); } }
Selector选择器组合使用:
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 > *: 查找某个父元素下所有直接子元素
以上是关于Jsoup的主要内容,如果未能解决你的问题,请参考以下文章