jsoup---代码版

项目结构

在这里插入图片描述

配置文件

  1. pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.xiaoge</groupId>
        <artifactId>xiaoge-crawler-first</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
    
            <!-- 自动的抓取数据的jar包, httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
    
            <!-- 日志信息 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.25</version>
                <!--<scope>test</scope>-->
            </dependency>
    
            <!-- jsoup包 -->
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.10.2</version>
            </dependency>
    
            <!-- Junit测试 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <!-- 工具commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.7</version>
            </dependency>
    
            <!-- 工具commons-lang3 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.7</version>
            </dependency>
    
    
        </dependencies>
    
    </project>
    
  2. log4j.properties

    log4j.rootLogger=DEBUG,A1
    log4j.logger.cn.itcast=DEBUG
    
    # 在控制台显示日志
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
    

前台文件

  1. test.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>CSDN - 专业开发者社区</title>
    </head>
    <body>
        <div class="city">
            <h3 id="city_bj">北京中心</h3>
            <img src="/2018czgw/images/slogan.jpg/" class="slogan" />
                <div class="city_in">
                    <div class="city_con" style="display: none;">
                        <ul>
                            <li id="test" city="北京" class="class_a class_b">
                                <a href="https://www.csdn.net/" target="_blank">
                                    <span class="s_name">北京</span>
                                </a>
                            </li>
                            <li>
                                <a href="https://www.csdn.net/" target="_blank">
                                    <span class="s_name">上海</span>
                                </a>
                            </li>
    
                            <li>
                                <a href="https://www.csdn.net/" target="_blank">
                                    <span abc="123" class="s_name">广州</span>
                                </a>
                            </li>
    
                            <ul>
                                <li>天津</li>
                            </ul>
                        </ul>
                    </div>
                </div>
        </div>
    </body>
    </html>
    

测试文件

  1. JsoupFirstTest

    package jsoup;
    
    import org.apache.commons.io.FileUtils;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.junit.Test;
    
    import java.io.File;
    import java.net.URL;
    import java.util.Set;
    
    /**
     * @Author: 潇哥
     * @DateTime: 2020/9/24 下午11:16
     * @Description: TODO
     */
    public class JsoupFirstTest {
    
        /**
         * 解析一个url
         * @throws Exception
         */
        @Test
        public void testUrl() throws Exception {
            // 解析url地址, 第一个参数是访问的url, 第二个参数是访问时候的超时时间/单位毫秒
            Document document = Jsoup.parse(new URL("https://www.csdn.net/"), 1000);
    
            // 使用标签选择器, 获取title标签中的内容
            String title = document.getElementsByTag("title").first().text();
    
            // 打印
            System.out.println(title);
    
        }
    
    
        /**
         * 读取文件, 解析字符串
         * @throws Exception
         */
        @Test
        public void testString() throws Exception {
            // 使用工具类读取文件, 获取字符串
            String content = FileUtils.readFileToString(new File("/Users/xiaoge/IdeaProjects" +
                    "/xiaoge-crawler-first/target/classes/template/test.html"), "utf8");
    
            // 解析字符串
            Document document = Jsoup.parse(content);
    
            // 使用标签选择器, 获取title标签中的内容
            String title = document.getElementsByTag("title").first().text();
    
            // 打印
            System.out.println(title);
        }
    
    
        /**
         * 解析文件
         * @throws Exception
         */
        @Test
        public void testFile() throws Exception {
            // 解析文件
            Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" +
                    "target/classes/template/test.html"), "utf8");
    
            // 获取该文本中 title标签中的内容
            String title = document.getElementsByTag("title").first().text();
    
            System.out.println(title);
    
        }
    
    
        /**
         * 获取元素的方法
         * @throws Exception
         */
        @Test
        public void testDom() throws Exception {
            // 解析文件, 获取document对象
            Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" +
                    "target/classes/template/test.html"), "utf8");
    
    
            // 获取元素
            // 1. 根据id查询元素getElementById
            String cityBj = document.getElementById("city_bj").text();
            System.out.println("获取到的元素内容是: " + cityBj);
    
            // 2. 根据标签获取元素getElementsByTag
            String span = document.getElementsByTag("span").first().text();
            System.out.println("获取到的第一个元素内容是: " + span);
    
            // 3. 根据class获取元素getElementsByClass
            String classAClassB = document.getElementsByClass("class_a class_b").first().text();
            System.out.println("获取到的第一个元素内容是: " + classAClassB);
            String classA = document.getElementsByClass("class_a").first().text();
            System.out.println("获取到的第一个元素内容是: " + classA);
            String classB = document.getElementsByClass("class_b").first().text();
            System.out.println("获取到的第一个元素内容是: " + classB);
    
            // 4. 根据属性获取元素getElementsByAttribute
            String abc = document.getElementsByAttribute("abc").first().text();
            System.out.println("获取到的第一个元素内容是: " + abc);
    
        }
    
    
        /**
         * 根据元素获取元素数据
         * @throws Exception
         */
        @Test
        public void testData() throws Exception{
            // 解析文件, 获取Document
            Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" +
                    "target/classes/template/test.html"), "utf8");
    
            // 根据id获取元素
            Element element = document.getElementById("test");
    
    
            // 元素中获取数据:
            // 1. 从元素中获取id
            String id = element.id();
            System.out.println("获取到的数据是: " + id);
    
    
            // 2. 从元素中获取className
            String className = element.className();
            System.out.println("获取到的数据是: " + className);
    
            Set<String> classNames = element.classNames();
            System.out.println("获取到的数据是: " + classNames);
    
    
            // 3. 从元素中获取属性值的attr
            String city = element.attr("city");
            System.out.println("获取到的数据是: " + city);
    
            String attrId = element.attr("id");
            System.out.println("获取到的数据是: " + attrId);
    
    
            // 4. 从元素中获取所有属性attributes
            String attrs = element.attributes().toString();
            System.out.println("获取到的数据是: " + attrs);
    
    
            // 5. 从元素中获取文本内容text
            String text = element.text();
            System.out.println("获取到的数据是: " + text);
    
        }
    
    
        /**
         * 使用选择器获取元素
         * @throws Exception
         */
        @Test
        public void testSelector() throws Exception{
            // 解析html文件, 获取Document对象
            Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" +
                    "target/classes/template/test.html"), "utf8");
    
            // tagname: 通过标签查找元素, 比如: span
            String span = document.select("span").first().text();
            System.out.println("获取到的数据是: " + span);
    
            // #id: 通过ID查找元素, 比如: #city_bj
            String cityBj = document.select("#city_bj").first().text();
            System.out.println("获取到的数据是: " + cityBj);
    
            // .class: 通过class名称查找元素, 比如: .class_a
            String classA = document.select(".class_a").first().text();
            System.out.println("获取到的数据是: " + classA);
    
            // [attribute]: 利用属性查找元素, 比如: [abc]
            String abc = document.select("[abc]").first().text();
            System.out.println("获取到的数据是: " + abc);
    
            // [attr=value]: 利用属性值来查找元素, 比如: [class=s_name]
            String classSName = document.select("[class=s_name]").first().text();
            System.out.println("获取到的数据是: " + classSName);
    
        }
    
    
        /**
         * 使用组合选择器获取元素
         * @throws Exception
         */
        @Test
        public void testSelector2() throws Exception{
            // 解析html文件, 获取Document对象
            Document document = Jsoup.parse(new File("/Users/xiaoge/IdeaProjects/xiaoge-crawler-first/" +
                    "target/classes/template/test.html"), "utf8");
    
            // el#id: 元素+ID, 比如: h3#city_bj
            String cityBj = document.select("h3#city_bj").first().text();
            System.out.println("获取到的内容是: " + cityBj);
    
    
            // el.class: 元素+class, 比如: li.class_a
            String classA = document.select("li.class_a").first().text();
            System.out.println("获取到的内容是: " + classA);
    
    
            // el[attr]: 元素+属性名, 比如: span[abc]
            String spanAbc = document.select("span[abc]").first().text();
            System.out.println("获取到的内容是: " + spanAbc);
    
    
            // 任意组合: 比如: span[abc].s_name
            String spanAbcSName = document.select("span[abc].s_name").first().text();
            System.out.println("获取到的内容是: " + spanAbcSName);
    
    
            // ancestor child: 查找某个元素下子元素, 比如: .city_con li 查找"city_con"下的所有li
            String cityConLi = document.select(".city_con li").first().text();
            System.out.println("获取到的内容是: " + cityConLi);
    
    
            // parent > child: 查找某个父元素下的直接子元素, 比如: .city_con > ul > li
            // 查找 city_con 第一级(直接子元素) 的ul, 再找所有ul下的第一级li
            String cityConUlLi = document.select(".city_con > ul > li").first().text();
            System.out.println("获取到的内容是: " + cityConUlLi);
    
            /*
             String cityConLi2 = document.select(".city_con > li").first().text();
             会抛出空指针异常, 因为 .city_con是在div中的class div一级子元素没有li而是ul
            */
            // System.out.println("获取到的内容是: --" + cityConLi2);
    
    
            // parent > *: 查找某个父元素下所有直接子元素
            Elements elements = document.select("ul > li");
            for (Element element : elements) {
                System.out.println("获取到的内容是: " + element.text());
            }
    
        }
    
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值