数据采集jsoup

数据采集jsoup

-jsoup介绍:
1. jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。
2. jsoup 的主要功能如下:
- 从一个 URL或字符串中解析 HTML;
- 使用 DOM或 CSS 选择器来查找、取出数据;
- 可操作 HTML 元素、属性、文本;
3. jsoup 是基于 MIT协议发布的,可放心使用于商业项目。

  • jsoup环境配置:

    • idea jsoup环境配置:
      1. 导jar包:

        • 下载jar包:官网在这里插入图片描述

        • 导入jar包:
          在这里插入图片描述

      2. 创建Maven项目使用dependency

        • 在pom.xml文件中 section中插入以下代码:

          <dependency>
            <!-- jsoup HTML parser library @ https://jsoup.org/ -->
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
          </dependency>
          
  • Jsoup的重要类:在这里插入图片描述

  • Jsoup解析网页

    1. 连接给定URL载入html文件

      • 方法1:使用Jsoup.connect(String url )方法从URL加载HTML。

      • 方法说明:与给定url建立新的连接,用于获取和解析HTML页面。

      • 案例分析:

        Document doc = Jsoup.connect("http://www.hnkjxy.net.cn/").get();
                    System.out.println(doc.text());//输出网页
                    System.out.println(doc.title());//输出标题
        
        Document doc = Jsoup.connect("https://www.educoder.net/")
        .data("query","java")//请求参数
        .userAgent("I'm jsoup")//设置User-Agent
        .cookie("auth","token")//设置cookie
        .timeout(3000)//设置连接超时时间
        .post()//使用POST方法访问URL
        .get()//使用GET方法访问URL
        
        • 方法2:获取URL解析成HTML,大多数情况下我们使用connect(String)代替。
        • 方法说明:timeoutMilis是设置连接超时,单位为毫秒。
    2. 本地文件内容解析成html文档

      • 使用Jsoup.parse()方法从文件加载到HTML

      • 方法介绍:在这里插入图片描述
        注 :in:文件位置、charsetName:编码格式、baseUri基于的URL地址,以解决相对链接问题。

      • 案例分析:

        //1.爬取网页并保存
                    Document doc = Jsoup.connect("http://www.hnkjxy.net.cn/").get();
                    FileWriter fw = new FileWriter("官网.html");
                    fw.write(doc.toString());
                    fw.close();
                    //2.解析本地文件并保存输出
                    Document doc2 = Jsoup.parse(new File("D:\\bigDataDevelop\\index.html"),"utf-8","http://www.hnkjxy.net.cn/");
                    System.out.println(doc2.text());
                    System.out.println(doc2.title());
        
    3. 给定字符串解析成html文档

      • 使用Jsoup.parse()方法从字符串加载HTML。

      • 方法介绍:在这里插入图片描述
        这方法能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。

      • 案例分析:

        Document doc = Jsoup.parse("<html><head><title>First parse</title>"
                            + "</head>body><p>Parsed HTML into a doc.</p></body>"
                            + "</html>\r\n");
                    System.out.println(doc.toString());
                    System.out.println(doc.title());
        
    4. 小结:jsoup 是一款Java 的HTML解析器。可以从URL、本地文件和字符串中解析HTML。在这里插入图片描述

  • DOM方法查找元素

    • 查找元素

      1. 基本方法介绍:在这里插入图片描述

      2. 案例分析:

        //        有本地文件example.com.html,解析文件,查找html元素。
        //        提取id=one的元素?
        //        提取class=lianjie的元素?
        //        提取标签为a的元素?
        //        提取标签为div的元素?
        //        提取属性为href的元素
                try {
                    Document doc = Jsoup.parse(new File("example.com.html"),"utf-8");
                    Element id_one = doc.getElementById("one");
                    Elements class_lianjie = doc.getElementsByClass("lianjie");
                    Elements tag_a = doc.getElementsByTag("a");
                    Elements tag_div = doc.getElementsByTag("div");
                    Elements attr_href = doc.getElementsByAttribute("href");
                    System.out.println("id_one:"+id_one+"\ntag_a:"+tag_a+"\nclass_lianjie:"+class_lianjie+"\ntag_div:"+tag_div+"\n"+"attr_href:"+attr_href);
                }catch (Exception e){
                    System.out.println("报错!");
                }
        
      3. 同级元素方法介绍:在这里插入图片描述

      4. 案例分析:

        //        获取同级元素。
        //        获取第一个className等于“lianjie”的元素的同级元素?
        //        获取第二个className等于“lianjie”的元素的前一个同级元素?
                try {
                    Document doc = Jsoup.parse(new File("example.com.html"),"utf-8");
                    Elements siblingElements = doc.getElementsByClass("lianjie").get(0).siblingElements();
                    System.out.println("siblingElements:"+siblingElements);
                    Element previousElementSibling = doc.getElementsByClass("lianjie").get(1).previousElementSibling();
                    System.out.println("previousElementSibling:"+previousElementSibling);
                }catch (Exception e){
                    System.out.println("报错!");
                }
        
      5. Graph方法介绍:在这里插入图片描述

      6. 案例分析:

        //        按图查找元素
        //        获取id为“two” 的div标签的子标签。
                try {
                    Document doc = Jsoup.parse(new File("example.com.html"),"utf-8");
                    Elements id_two = doc.getElementById("two").getElementsByTag("div");
                    Elements div = id_two.get(0).children();
                    System.out.println(div);
                }catch (Exception e){
                    System.out.println("报错!");
                }
        
    • 查找元素数据

      1. 方法介绍:在这里插入图片描述
      2. 方法介绍:
        在这里插入图片描述
        在这里插入图片描述
    • 操作HTML和文本:在这里插入图片描述

  • Slector选择器方法查找元素

    jsoup elements对象支持类似于CSS (或jquery的选择器语法,来实现非常强大和灵活的查找功能。可以使用Element.select(String selector)和 Elements.select(String selector)方法实现

    • 选择器基础1

      tagname: 通过标签查找元素,比如:a
      ns|tag: 通过标签在命名空间r查找元素,比如:可以用 fb|name 语法来查找 fb:name 元素
      #id: 通过ID查找元素,比如:#logo
      .class: 通过class名称查找元素,比如:.masthead
      [attribute]: 利用属性查找元素,比如:[href]

    • 选择器组合使用

      el#id: 元素+ID,比如: div#logo
      el.class: 元素+class,比如: div.masthead
      el[attr]: 元素+class,比如: a[href]
      任意组合,比如:a[href].highlight
      ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 p元素
      parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
      siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
      siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
      el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo

    • 伪选择器selectors

      :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素

      :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素

      :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素

      :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has§表示哪些div包含了p元素

      :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=“logo” 元素的所有 div 列表

      :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)

      :containsOwn(text): 查找直接包含给定文本的元素

      :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)

      :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素

      注意:上述伪选择器索引是从0开始的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值