jsoup

news2025/1/11 14:07:42

1.什么是jsoup

jsoup:Java HTML解析器,专为HTML编辑,清理,抓取和XSS安全而构建

 2.依赖

<dependency>
  <!-- jsoup HTML parser library @ https://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.15.3</version>
</dependency>
//方便处理数据 ,你可以用Google 的JSON 或者其他的JSON都行
  <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

3.使用

1.发送请求

 2.设置请求方式

第一种:

第二种:

3.设置请求头 

token也是放在请求头中,请求头内容设置也有可能是存在多条

4.传参

@RequestBody 和@RequestParam,

 上传文件

5.响应

处理响应一般分为对JSON的处理 和对流的处理,JSON这么处理 我这里就不说了,主要说下下载文件,jsoup下载文件 默认是1 M ,

写法一:


    @Test
    void contextLoads() throws Exception {
        String url = "https://search.**.com" ;
        Connection con = Jsoup.connect(url);
        Connection.Response response =
                con.maxBodySize(999999999).method(Connection.Method.GET).ignoreContentType(true).execute();

        byte[] bufferedInputStream = response.bodyAsBytes();
        saveFile(bufferedInputStream,"/.");

    }
    /**
     * saveFile 保存文件操作
     *
     * @param in       字节数组
     * @param savePath 存储路径
     * @throws IOException 异常处理
     */
    static void saveFile(byte[] in, String savePath) throws IOException {
        //byte[] buffer = new byte[1024];
        //int len = 0;
        // 创建缓冲流

        FileOutputStream fileOutStream = new FileOutputStream(new File(savePath));
        BufferedOutputStream bufferedOut = new BufferedOutputStream(fileOutStream);
        // 图片写入
        bufferedOut.write(in, 0, in.length);
        // 缓冲流释放与关闭
        bufferedOut.flush();
        bufferedOut.close();
    }

写法二:

  @Test
    void contextLoads() throws Exception {
        String url = "https://search.**.com" ;
        Connection con = Jsoup.connect(url);
        Connection.Response response =
                con.maxBodySize(999999999).method(Connection.Method.GET).ignoreContentType(true).execute();

        BufferedInputStream bufferedInputStream = response.bodyStream();
        System.out.println(response.contentType());
        saveFile(bufferedInputStream,"C:\\Users\\19167\\Desktop\\1.jpg");//保存文件的地址

    }

    /**
     * 保存文件到本地
     * @param bufferedInputStream
     * @param savePath
     */
    public static void saveFile(BufferedInputStream bufferedInputStream,String savePath) throws IOException {
        //一次最多读取1k
        byte[] buffer = new byte[1024];
        //实际读取的长度
        int readLenghth;
        //根据文件保存地址,创建文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream(new File(savePath));
        //创建的一个写出的缓冲流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        //文件逐步写入本地
        while ((readLenghth = bufferedInputStream.read(buffer,0,1024)) != -1){//先读出来,保存在buffer数组中
            System.out.println(readLenghth);
            bufferedOutputStream.write(buffer,0,readLenghth);//再从buffer中取出来保存到本地
        }
        //关闭缓冲流
        bufferedOutputStream.close();
        fileOutputStream.close();
        bufferedInputStream.close();
    }

如果你只是为了完成上面的操作,你可以不用jsoup,如果只是简单的调接口,选择hutool ,httpclient 等。我个人喜欢用hutool,主要是比较全,大部分要的功能都有

6.HTML解析

jsoup的也支持html文件的解析 


    @Test
    void contextLoads() throws Exception {
        String url = "https://**.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&pvid=7df949471db54d0f8da255705846b05c" ;
        Document document = Jsoup.parse(new URL(url), 30000);
        System.out.println(document+"测试时候后");

    }

1.属性值

 @Test
    void contextLoads() throws Exception {
        String url = "https://**.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&pvid=7df949471db54d0f8da255705846b05c";
        Document document = Jsoup.parse(new URL(url), 30000);
        //类别选择器 .class
        document.getElementsByClass("dd").text();
        // 标签选择器
        document.getElementsByTag("title").text();
        //id选择器
        document.getElementById("J_accessibility").text();
        //根据属性获取元素   target="_blank"
        final Element target = document.getElementsByAttribute("target").first();
        System.out.println(target.text());
        //根据 属性 的key和值 获取值
         Element first = document.getElementsByAttributeValue("target", "_blank").first();
        System.out.println(first.text());


    }

 2.从元素中获取

@Test
    void contextLoads() throws Exception {
        String url = "https://**.jd.com/Search?keyword=%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC&pvid=7df949471db54d0f8da255705846b05c";
        Document doc = Jsoup.parse(new URL(url), 30000);

        Element element = doc.getElementById("J_accessibility");
        //获取元素中的 id
        String id = element.id();

        //获取元素中的 class
        String name = element.className();


        //从元素中获取属性的值 attr
        final String id1 = element.attr("id");

        //从元素中获取所有属性
        final Attributes attributes = element.attributes();
      
        //从元素中获取文本text
        element.text();


    }

· 3.通过选择器

  //通过标签
        Elements div = doc.select("div");
        for (Element element : div) {
            System.out.println(element.text());

        }
        //通过 id查找 #id   写法为: #+(id标签值)
        Elements ids = doc.select("#dd");
        for (Element id : ids) {
            System.out.println(id.text());

        }
        //通过 .class查找元素 写法为 .+(class标签的值)
        final Elements select = doc.select(".ss");

        //利用属性值查找元素
        Elements select1 = doc.select("[adc]");
        // [attr=value]: 利用属性值来查找元素,比如:[width=500]
        doc.select("[class=vlli]").first().text();

 4.组合使用

        String str = "";
        // 组合选择器
// el#id: 元素+ID,比如: div#logo
        str = doc.select("li#auto-header-fenzhan").first().text();

// el.class: 元素+class,比如: div.masthead
        str = doc.select("a.greylink").first().text();

// el[attr]: 元素+属性,比如: a[href]
        str = doc.select("a[href]").first().attr("href");

// 任意组合,比如:a[href].highlight
        str = doc.select("a[href].greylink").first().attr("href");

// ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找"body"下的所有 p
        str = doc.select("div.mini-left a").text();

// parent > child: 查找某个父元素下的直接子元素,比如:div.content > p 查找 p
        str = doc.select("div.mini-left ul > li").text();

// parent > * 查找某个父元素下所有直接子元素
        Elements elements = doc.select("div.mini-left > *");
        for (Element ele : elements) {
            System.out.println(ele.tagName());
        }
  • el#id: 元素+ID,比如: div#logo
  • el.class: 元素+class,比如: div.masthead
  • el[attr]: 元素+属性名,比如: a[href]
  • 任意组合,比如:a[href].highlight
  • ancestor child: 查找某个元素下子元素,比如:.body p 查找"body"下的所有 p
  • parent > child: 查找某个父元素下的直接子元素,比如:div.content > p 查找 p
  • parent > * 查找某个父元素下所有直接子元素
  • siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
  • siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
  • :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(p)表示哪些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,第二个元素index为1等

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货!深入学习必学的模型微调

学习目标 知道微调的原理能够利用微调模型来完成图像的分类任务1.微调 如何在只有6万张图像的MNIST训练数据集上训练模型。学术界当下使用最广泛的大规模图像数据集ImageNet&#xff0c;它有超过1,000万的图像和1,000类的物体。然而&#xff0c;我们平常接触到数据集的规模通…

浅析JWT

Cookie-session 我们都知道JWT一般用于用户登录等需要记住的操作&#xff0c;在谈论JWT之前就不得不谈谈以前的cookie-session登录了 。因为http协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客…

【从零开始学微服务】08.引入微服务架构的时机

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 在了解引入微服务架构的时机之前&#xff0c;架构设计时一般需要遵循的三个原则。 架构设计三个原则 架构设计一般需要遵循以下三个原则&#xff1a; 合适原则&#xff1a;合适…

NeurIPS'22 | APG:面向CTR预估的自适应参数生成网络

丨目录&#xff1a; 摘要 背景 Method 实验 结语▐ 摘要目前基于深度学习的CTR预估模型&#xff08;即 Deep CTR Models&#xff09;被广泛的应用于各个应用中。传统的 Deep CTR Models 的学习模式是相对静态的&#xff0c;即所有的样本共享相同的网络参数。然而&#xff0c;由…

IntelliJ IDEA中我最爱的10个快捷操作

1. psvm/main快速生成 main() 方法 在日常开发中&#xff0c;我们经常需要写main()方法&#xff0c;这时候您也可以使用main或者psvm命令快速地帮助我们创建出main()方法。 2.sout快速生成println()方法 打印输出一些内容到控制台也是频率很高的一个行为&#xff0c;我们可以…

Pytest断言

&#x1f534;pytest 允许使用标准的python assert 用于验证Python测试中的期望和值。所以并不像unittest的那么丰富。但是我们可以重写。 ❞小例子--介绍 import pytestclass Testnew:def test_num(self):assert 1 "1"def test_dic(self):assert {"QA":…

MySql索引下推知识分享

作者&#xff1a;刘邓忠 Mysql 是大家最常用的数据库&#xff0c;下面为大家带来 mysql 索引下推知识点的分享&#xff0c;以便巩固 mysql 基础知识&#xff0c;如有错误&#xff0c;还请各位大佬们指正。 1 什么是索引下推 索引下推 (Index Condition Pushdown&#xff0c;…

技术分享 | 测试的本质是什么?

本文将分别浅谈不同阶段的业务、不同端的业务、不同类型的业务的测试差异&#xff0c;再抽离其中的测试目标/本质。仅为笔者个人观点&#xff0c;欢迎批评指正。 一、不同阶段业务对测试的需求不同 不同阶段业务对测试的需求不同。这点几乎经历过的人员都心有戚戚焉。 从0到1的…

盘点导致Spring事务失效的4个场景

1&#xff0c;非运行时异常导致事务无法回滚 我们知道&#xff0c;Spring是通过AOP的方式来实现事务的&#xff0c;而在处理事务的过程中&#xff0c;Spring只有捕获到RuntimeException或者Error的时候才会触发回滚操作&#xff0c;如果我们在代码中抛出的是非运行时异常&…

Web前端学习之虚拟DOM如何进化为真实DOM

Vue和React的Render函数中都涉及到了Virtual DOM的概念&#xff0c;Virtual DOM也是性能优化上的重要一环&#xff0c;同时突破了直接操作真实DOM的瓶颈&#xff0c;本文带着以下几个问题来阐述Virtual DOM。 1.为什么要操作虚拟 DOM? 2.什么是虚拟 DOM? 3.手把手教你实现…

Word内容解析之图表数据获取

最近遇到一个问题&#xff0c;Word里有个从Excel直接复制进去的图&#xff0c;但那个Excel已经找不到了&#xff0c;无法通过编辑数据获取到表格的数据。这个其实可以用getdata等软件获取&#xff0c;或者鼠标点在表上的点就可以显示数据&#xff0c;再把数据录下来&#xff0c…

更加灵活、经济、高效的训练 — 新一代搜推广稀疏大模型训练范式GBA

作者&#xff1a;苏文博、张远行 近日&#xff0c;阿里巴巴在国际顶级机器学习会议NeurIPS 2022上发表了新的自研训练模式 Gloabl Batch gradients Aggregation&#xff08;GBA&#xff0c;论文链接&#xff1a;https://arxiv.org/abs/2205.11048&#xff09;&#xff0c;由阿里…

模拟电子技术(七)波形的发生和信号的转换

&#xff08;七&#xff09;波形的发生和信号的转换正弦波振荡电路RC正弦波振荡电路LC正弦波振荡电路正弦波振荡例题电压比较器单限比较器过零比较器一般单限比较器滞回比较器窗口比较器电压比较器例题非正弦波发生电路矩形波发生电路三角波发生电路锯齿波发生电路信号转换电路…

Visual Studio 调试无法启动调试,拒绝访问

方法一 win更新了不兼容 &#xff0c;卸载更新。 1、单击开始菜单&#xff0c;选择【设置】如下图&#xff1b; 2、然后再进入【更新和安全】选项&#xff0c;如下图&#xff1b; 3、查看已安装更新历史记录&#xff0c;如下图红圈 4、这个页面详细列出了最新的更新&#xf…

绿盟SecXOps安全智能分析技术白皮书 安全分析模型核心服务部署

安全分析模型核心服务部署 ModelOps 对所有的人工智能 模型&#xff08;图形模型、语言模型、基于规则的模型&#xff09;以及决策模型的整个生命周期 进行管理&#xff0c;确保对生产中的所有模型进行独立验证和问责&#xff0c;其核心功能涵盖了模型存储、模型测试、模型回滚…

28. 如何使用 SAP OData 服务向 ABAP 服务器上传文件

文章目录 1. 创建对应的自定义数据库表和 ABAP DDIC 结构2. 完成 SEGW 事物码里模型的增强3. 完成必要的 ABAP 编码本教程到目前为止开发的 OData 图书管理服务,可以在 ABAP 系统里对图书数据进行增删改查。 本步骤我们继续介绍如何通过 SAP OData 服务,实现向 ABAP 系统上传…

0.96寸OLED显示屏介绍

OLED显示屏简介 OLED&#xff0c;即有机发光二极管&#xff08;Organic Light Emitting Diode&#xff09;。OLED 由于同时具备自发光&#xff0c;不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性&#x…

【C语言】常见字符函数和字符串函数

1.1strlen size_t strlen(const char* str); 字符串已经\0作为结束标志&#xff0c;strlen函数返回的是在字符串中\0前面出现的字符个数&#xff08;不包含\0&#xff09;。 参数指向的字符串必须以\0结束。 注意函数的返回值为size_t&#xff0c;是无符号整形&#xff08;…

五、Vector底层源码详解

文章目录特点底层源码分析有参构造器public Vector(int initialCapacity, int capacityIncrement)有参构造器public Vector(int initialCapacity)有参构造器public Vector(Collection<? extends E> c)无参构造器public Vector()扩容机制特点 底层是elementDate数组线程…

自学Python真的可以吗?

自学当然可以学成功python了&#xff0c;但是前提是你需要认真去学&#xff0c;而不是三天打渔两天晒网的&#xff0c;因为python初学很容易&#xff0c;稍微过几天忘记也很容易&#xff0c;所以一定要坚持学习&#xff0c;并且通过平时多加练习来熟练掌握各个知识点。 一、学…