Jsoup
我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术。
1.1. jsoup介绍
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
1 <dependency> 2 <groupId>org.jsoup</groupId> 3 <artifactId>jsoup</artifactId> 4 <version>1.10.3</version> 5 </dependency> 6 <!--测试--> 7 <dependency> 8 <groupId>junit</groupId> 9 <artifactId>junit</artifactId> 10 <version>4.12</version> 11 </dependency> 12 <!--工具--> 13 <dependency> 14 <groupId>org.apache.commons</groupId> 15 <artifactId>commons-lang3</artifactId> 16 <version>3.7</version> 17 </dependency> 18 <dependency> 19 <groupId>commons-io</groupId> 20 <artifactId>commons-io</artifactId> 21 <version>2.6</version> 22 </dependency>
使用dom方式遍历文档
元素获取
- 根据id查询元素getElementById
- 根据标签获取元素getElementsByTag
- 根据class获取元素getElementsByClass
- 根据属性获取元素getElementsByAttribute
元素中获取数据
- 从元素中获取id
- 从元素中获取className
- 从元素中获取属性的值attr
- 从元素中获取所有属性attributes
- 从元素中获取文本内容text
使用选择器语法查找元素
jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。
Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。
使用dom方式遍历文档
tagname: 通过标签查找元素,比如:span
#id: 通过ID查找元素,比如:# city_bj
.class: 通过class名称查找元素,比如:.class_a
[attribute]: 利用属性查找元素,比如:[abc]
[attr=value]: 利用属性值来查找元素,比如:[class=s_name]
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 > *: 查找某个父元素下所有直接子元素
代码测试
public class JsoupTest { @Test public void testJsoupUrl() throws Exception { // 解析url地址 Document document = Jsoup.parse(new URL("http://www.jingdong.com/"), 1000); //获取title的内容 Element title = document.getElementsByTag("title").first(); System.out.println(title.text()); } @Test public void testJsoupHtml() throws Exception { // 解析文件 Document document = Jsoup.parse(new File("F:\boss\1.html"), "UTF-8"); //获取title的内容 Element title = document.getElementsByTag("title").first(); System.out.println(title.text()); //1.根据id查询元素getElementById Element element = document.getElementById("city_bj"); System.out.println(element.text()); //2.根据标签获取元素getElementsByTag element = document.getElementsByTag("title").first(); System.out.println(element.text()); //3.根据class获取元素getElementsByClass element = document.getElementsByClass("s_name").last(); System.out.println(element.text()); //4.根据属性获取元素getElementsByAttribute element = document.getElementsByAttribute("abc").first(); System.out.println("abc:" + element.text()); //定义属性 element = document.getElementsByAttributeValue("class", "city_con").first(); System.out.println(element.text()); } /** * 标签属性选择 * * @throws Exception */ @Test public void testJsoupHtml2() throws Exception { //解析文件 Document document = Jsoup.parse(new File("F:\boss\1.html"), "UTF-8"); //获取元素 Element element = document.getElementById("test"); //1.从元素中获取id String str = element.id(); System.out.println("id:" + str); //2.从元素中获取className str = element.className(); System.out.println("className:" + str); //3.从元素中获取属性的值attr str = element.attr("id"); System.out.println("attr:" + str); //4.从元素中获取所有属性attributes str = element.attributes().toString(); System.out.println("attributes:" + str); //5.从元素中获取文本内容text str = element.text(); System.out.println("text:" + str); } /** * css 选择器 * * @throws Exception */ @Test public void testJsoupHtml3() throws Exception { //解析文件 Document document = Jsoup.parse(new File("F:\boss\1.html"), "UTF-8"); //tagname: 通过标签查找元素,比如:span Elements span = document.select("span"); for (Element element : span) { System.out.println("span:" + element.text()); } //#id: 通过ID查找元素,比如:#city_bjj String str = document.select("#city_bj").text(); System.out.println("#city_bj" + str); //.class: 通过class名称查找元素,比如:.class_a str = document.select(".class_a").text(); System.out.println(".class_a" + str); //[attribute]: 利用属性查找元素,比如:[abc] str = document.select("[abc]").text(); System.out.println("[abc]" + str); //[attr=value]: 利用属性值来查找元素,比如:[class=s_name] str = document.select("[class=s_name]").text(); System.out.println("#[class=s_name]" + str); } /** * 组合选择器 * * @throws Exception */ @Test public void testJsoupHtml4() throws Exception { Document document = Jsoup.parse(new File("F:\boss\1.html"), "UTF-8"); //el#id: 元素+ID,比如: h3#city_bj String str = document.select("h3#city_bj").text(); //el.class: 元素+class,比如: li.class_a str = document.select("li.class_a").text(); //el[attr]: 元素+属性名,比如: span[abc] str = document.select("span[abc]").text(); //任意组合,比如:span[abc].s_name str = document.select("span[abc].s_name").text(); //ancestor child: 查找某个元素下子元素,比如:.city_con li 查找"city_con"下的所有li str = document.select(".city_con li").text(); //parent > child: 查找某个父元素下的直接子元素, //比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li str = document.select(".city_con > ul > li").text(); //parent > * 查找某个父元素下所有直接子元素.city_con > * str = document.select(".city_con > *").text(); }