Java网络爬虫(五)——Jsoup解析爬取的数据

Jsoup介绍

  • 为什么用Jsoup?
    • 我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术。
  • Jsoup介绍
    • Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  • Jsoup的主要功能
    1. 从一个URL、文件或字符串中解析HTML;
    2. 使用DOM或CSS选择器来查找、取出数据;
    3. 可操作HTML元素、属性、文本;

加入Jsoup依赖

<!--Jsoup-->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
<!--测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</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>

解析URL

  • Jsoup可以直接输入url,它会发起请求并获取数据,封装为Document对象
  • 代码:
	@Test
	public void testUrl() throws Exception{
	    //解析URL地址,第一个参数是访问的URL,第二个参数是访问时的超时时间
	    Document doc = Jsoup.parse(new URL("https://www.icourse163.org/"), 1000);
	    //使用标签选择器,获取指定标签中的内容
	    Element element = doc.getElementsByTag("title").first();
	    System.out.println(element);
	    System.out.println(element.text());
	}
  • 页面指定的抓取元素:
    在这里插入图片描述
  • 解析抓取结果:
    在这里插入图片描述

疑问

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

解析字符串

  • 准备一个HTML文件
    在这里插入图片描述
  • 解析代码:
	@Test
    public void testString() throws Exception{
        //使用工具类读取文件,获取字符串
        String content = FileUtils.readFileToString(new File("C:\\Users\\fy\\Desktop\\test.html"), "utf-8");
        //解析字符串
        Document doc = Jsoup.parse(content);
        Element element = doc.getElementsByTag("title").first();
        System.out.println(element.text());
    }
  • 解析结果:
    在这里插入图片描述

解析文件

  • 准备一下个HTML文件
    在这里插入图片描述
    在这里插入图片描述
  • 解析代码:
	@Test
    public void testFile() throws Exception{
        //解析文件
        File file = new File("C:\\Users\\fy\\Desktop\\test.html");
        Document doc = Jsoup.parse(file, "utf-8");
        Elements elements = doc.getElementsByTag("a");
        for(Element element:elements){
            System.out.println(element.text());
        }
    }
  • 解析结果:
    在这里插入图片描述

使用DOM方式获取元素

  • 元素获取
    1. 根据i获取元素:getElementById()
    2. 根据标签获取元素:getElementsByTag()
    3. 根据class获取元素:getElementsByClass()
    4. 根据属性获取元素:getElementsByAttribute()getElementsByAttributeValue()
  • 代码:
		//1.    根据id查询元素getElementById
		Element element = document.getElementById("city_bj");
		//2.   根据标签获取元素getElementsByTag
		element = document.getElementsByTag("title").first();
		//3.   根据class获取元素getElementsByClass
		element = document.getElementsByClass("s_name").last();
		//4.   根据属性获取元素getElementsByAttribute
		element = document.getElementsByAttribute("abc").first();
		element = document.getElementsByAttributeValue("class", "city_con").first();
  • 元素中获取数据
    1. 从元素中获取id
    2. 从元素中获取className
    3. 从元素中获取属性的值attr
    4. 从元素中获取所有属性attributes
    5. 从元素中获取文本内容text
  • 代码:
//获取元素
		Element element = document.getElementById("test");
		//1.   从元素中获取id
		String str = element.id();
		//2.   从元素中获取className
		str = element.className();
		//3.   从元素中获取属性的值attr
		str = element.attr("id");
		//4.   从元素中获取所有属性attributes
		str = element.attributes().toString();
		//5.   从元素中获取文本内容text
		str = element.text();

使用选择器语法查找元素

  • Selector选择器概述
    • tagname: 通过标签查找元素,比如:span
    • #id: 通过ID查找元素,比如:# city_bj
    • .class: 通过class名称查找元素,比如:.class_a
  • 代码:
	   Document document = Jsoup.parse(new File("C:\\Users\\fy\\Desktop\\test.html"),"utf-8");
       //tagname: 通过标签查找元素,比如:span
       Elements elements = document.select("span");
       for (Element element : elements) {
           System.out.println(element.text());
       }
       //#id: 通过ID查找元素,比如:#city_bj
       String str = document.select("#city_bj").text();
       //.class: 通过class名称查找元素,比如:.class_a
       str = document.select(".class_a").text();
       //[attribute]: 利用属性查找元素,比如:[abc]
       str = document.select("[abc]").text();
       //[attr=value]: 利用属性值来查找元素,比如:[class=s_name]
       str = document.select("[class=s_name]").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 > *: 查找某个父元素下所有直接子元素
  • 代码:
		//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();
分类: 爬虫

0 条评论

发表评论

Avatar placeholder

您的电子邮箱地址不会被公开。