天天看点

Java网络爬虫之Jsoup解析

1.介绍

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

2.功能 

jsoup的主要功能如下:

    1. 从一个URL,文件或字符串中解析HTML;
    2. 使用DOM或CSS选择器来查找、取出数据;
    3. 可操作HTML元素、属性、文本;

 3.使用 

先加入Jsoup依赖(可从maven仓库获取:https://mvnrepository.com/):

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>
           

1)解析url

@Test
public void testUrl() throws Exception{
    // 解析url地址
    Document document = Jsoup.parse(new URL("https://www.baidu.com"),1000);

    // 获取title内容
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
}
           

2) 解析字符串:

准备:在此之前要自己见创建一个文本文档,内容是一个html页面

@Test
public void testString() throws  Exception{
    // 使用工具类获取文件 ,转出字符串
    String content = FileUtils.readFileToString(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");

    Document document = Jsoup.parse(content);
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
           

3)直接解析文件

@Test
public void testFile() throws Exception{
    Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
}
           

4)通过dom获取数据

@Test
public void testDOM() throws Exception{
    // 解析文件,获取document对象
    Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");

    // 获取元素
    // 1.根究id获取
    Element element = document.getElementById("city_bj");
    System.out.println("根究id获取:" + element.text());

    // 2.根据标签获取
    String span = document.getElementsByTag("span").first().text();
    System.out.println("根据标签获取:" + span);

    // 3. 根据class获取
    String classAAndB = document.getElementsByClass("class_a class_b").first().text();
    System.out.println("根据所有class获取:"+ classAAndB);

    String classA = document.getElementsByClass("class_a").first().text();
    System.out.println("根据class_a获取:"+ classA);

    String classB = document.getElementsByClass("class_b").first().text();
    System.out.println("根据class_b获取:" + classB);

    // 根据属性获取
    String abc = document.getElementsByAttribute("abc").first().text();
    System.out.println("根据属性获取:" + abc);

    // 根据属性和属性值获取
    String attr = document.getElementsByAttributeValue("href","http://sh.itcast.cn").first().text();
    System.out.println("根据属性和属性值获取:" + attr);
}
           

5)根据选择器获取数据

@Test
public void testSelector() throws Exception{
    // 解析文件,获取document对象
    Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");

    // 通过标签获取元素
    Elements elements = document.select("span");
    for (Element element : elements) {
        System.out.println("根据class查找:"+element.text());
    }

    // 根据id查找
    Elements elements1 = document.select("#city_bj");
    for (Element element : elements1) {
        System.out.println("根据id查找:"+element.text());
    }

    // 根据class查找
    Elements elements2 = document.select(".class_a");
    for (Element element : elements2) {
        System.out.println("根据class查找:"+element.text());
    }

    // 根据属性查找
    Elements elements3 = document.select("[abc]");
    for (Element element : elements3) {
        System.out.println("根据属性查找:"+element.text());
    }

    // 根据属性和属性值查找
    Elements elements4 = document.select("[class=s_name]");
    for (Element element : elements4) {
        System.out.println("根据属性和属性值查找:"+element.text());
    }
}
           

6)组合使用选择器

/**
 * 选择器组合使用
 * @throws Exception
 */
@Test
public void testSelector2() throws Exception{
    // 解析文件,获取document对象
    Document document = Jsoup.parse(new File("C:\\Users\\Luckyan\\Desktop\\itcast.txt"),"utf8");

    // 元素+id
    Element element = document.select("h3#city_bj").first();
    System.out.println("元素+id:"+element.text());

    // 元素+class
    Element element1 = document.select("li.class_a").first();
    System.out.println("元素+class:"+element1.text());

    // 元素+属性名
    Element element2 = document.select("span[abc]").first();
    System.out.println("元素+属性名:"+element2.text());

    // 任意组合,比如:span[abc].s_name
    Element element3 = document.select("span[abc].s_name").first();
    System.out.println("任意组合:"+element3.text());

    //parent > child: 查找某个父元素下的直接子元素,
    //比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
    Element element4 = document.select(".city_con > ul > li").first();
    System.out.println("直接子元素:"+element4.text());

    //parent > * 查找某个父元素下所有直接子元素.city_con > *
    Elements elements = document.select(".city_con > *");
    for (Element element5 : elements) {
        System.out.println("直接所有子元素:"+element5.text());
    }
}
           

继续阅读