JAVA爬虫 – Jsoup

jsoup 介绍

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

jsoup的主要功能如下:

  • 从一个URL,文件或字符串中解析HTML;
  • 使用DOM或CSS选择器来查找、取出数据;
  • 可操作HTML元素、属性、文本;( Jsoup一般用于解析爬到的数据并存储, 很少用到操作 )

1,准备环境,导入所需依赖

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
        </dependency>
		 <dependency>
	        <groupId>commons-io</groupId>
	        <artifactId>commons-io</artifactId>
	        <version>2.4</version>
    	</dependency>
		 <dependency>
	        <groupId>org.apache.commons</groupId>
	        <artifactId>commons-lang3</artifactId>
	     	<version>3.4</version>
      	</dependency>

2,获取网页第一个title标签的文本内容

	// 解析Url地址 参数1:访问的url,参数2:访问的超时时间
        Document doc = Jsoup.parse(new URL("http://www.myqxin.com"), 1000);
        // 使用选择器,获取想要的内容
        String title = doc.getElementsByTag("title").first().text();
        System.out.println(title);

虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用

3,jsoup解析字符串文件

 	// 使用工具类读取文件,获取字符串
        String context = FileUtils.readFileToString(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");
        // 解析字符串
        Document doc = Jsoup.parse(context);
 		// 解析文件
        //Document doc = Jsoup.parse(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");
        String title = doc.getElementsByTag("title").first().text();
        System.out.println(title);

这里的set.html内容是自己测试用的内容,仅仅是为了演示,实际情况根据你们所接触到的页面而定

4,使用dom 方式遍历文档

元素获取

  1. 根据id查询元素 getElementById
  2. 根据标签获取元素 getElementsByTag
  3. 根据class获取元素 getElementsByClass
  4. 根据属性获取元素 getElementsByAttribute
	// 解析文件,获取doc对象
        Document doc = Jsoup.parse(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");

        // 1,根据id查询元素 getElementById
        Element element1 = doc.getElementById("people");
        // 2,根据标签获取元素 getElementsByTag
        Element element2 = doc.getElementsByTag("span").first();

        // 3,根据class获取元素 getElementsByClass
        Element element3 = doc.getElementsByClass("").first();
        // 4,根据属性获取元素 getElementsByAttribute
        Element element4 = doc.getElementsByAttribute("").last();
        // 根据属性和属性值获取
        Element element5 = doc.getElementsByAttributeValue("abc","123").last();

元素中的数据获取

  1. 从元素中获取id
  2. 从元素中获取className
  3. 从元素中获取属性的值 attr
  4. 从元素中获取所有属性 attributes
  5. 从元素中获取文本内容 text
        // 解析文件,获取doc对象
        Document doc = Jsoup.parse(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");
        // 1,根据id查询元素 getElementById
        Element element = doc.getElementById("people");
        // 1,从元素中获取id
        String str1 = element.id();
        // 2,从元素中获取className
        String str2 = element.className();
        // 3,从元素中获取属性的值 attr
        String str3 = element.attr("id");
        // 4,从元素中获取所有属性 attributes
        Attributes str4 = element.attributes();
        // 5,从元素中获取文本内容 text
        String str5 = element.text();

5,使用选择器获取元素

selector选择器概述

  • tagname:通过标签查找元素,比如:span
  • #id:通过ID查找元素,比如:#myqxin
  • .class:通过class名称查找元素,比如:class_a
  • [attribute]:利用属性查找元素,比如:[abc]
  • [attr=value]:利用属性值查询元素,比如:[class=s_name]
	// 解析文件,获取doc对象
        Document doc = Jsoup.parse(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");
        // tagname:通过标签查找元素,比如:span
        Elements spans = doc.select("span");
        // #id:通过ID查找元素,比如:#myqxin
        Element first = doc.select("#myqxin").first();
        // .class:通过class名称查找元素,比如:class_a
        Element last = doc.select(".class_a").last();
        // [attribute]:利用属性查找元素,比如:[abc]
        Elements select = doc.select("[abc]");
        // [attr=value]:利用属性值查询元素,比如:[class=s_name]
        Elements elements1 = doc.select("[class=s_name]");
        Elements elements2 = doc.select("[id=myqxin]");

6,select选择器组合使用

  • el#id:元素+ID,比如:h3#myqxin
  • 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 > * :查找某个父元素下所有直接子元素
 	// 解析文件,获取doc对象
        Document doc = Jsoup.parse(new File("C:\\Users\\myqxin\\Desktop\\set.html"), "utf8");
        // el#id:元素+ID,比如:h3#myqxin
        Elements select1 = doc.select("h3#myqxin");
        // el.class:元素+class,比如:li.class_a
        Elements select2 = doc.select("li.class_a");
        // el[attr]:元素+属性名,比如:span[abc]
        Elements select3 = doc.select("span[abc]");
        // 任意组合:比如:span[abc].s_name
        Elements select4 = doc.select("span[abc].s_name");
        // ancestor child:查找某个元素下子元素,比如:.city_con li 查询“city_con”下的所有li
        Elements select5 = doc.select(".city_con li");
        // parent > child:查找某个父元素下的直接子元素,比如.city_con > ul > li 查找city_con 第一级(直接子元素)的 ul,再找所有ul 下的第一级li
        Elements select6 = doc.select(".city_con > ul > li");
        // parent > * :查找某个父元素下所有直接子元素
        Elements select7 = doc.select(".city_con > *");
© 版权声明
THE END
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=270198dipw4ko
点赞14赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片