• 爬虫-jsoup解析


    Jsoup

    我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术。

    1.1. jsoup介绍

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

    jsoup的主要功能如下:

    1. 从一个URL,文件或字符串中解析HTML;
    2. 使用DOM或CSS选择器来查找、取出数据;
    3. 可操作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方式遍历文档

    元素获取

    1. 根据id查询元素getElementById
    2. 根据标签获取元素getElementsByTag
    3. 根据class获取元素getElementsByClass
    4. 根据属性获取元素getElementsByAttribute

    元素中获取数据

    1. 从元素中获取id
    2. 从元素中获取className
    3. 从元素中获取属性的值attr
    4. 从元素中获取所有属性attributes
    5. 从元素中获取文本内容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();
        }
  • 相关阅读:
    BZOJ 2752: [HAOI2012]高速公路(road)
    codevs 1979 第K个数
    洛谷 P2680 运输计划
    hdu 3501 Calculation 2
    POJ 2417 Discrete Logging
    比较数组和字典
    js事件之event.preventDefault()与event.stopPropagation()用法区别
    alert
    js基本类型的包装对象
    js取自定义data属性
  • 原文地址:https://www.cnblogs.com/liushisaonian/p/11315101.html
Copyright © 2020-2023  润新知