SpringBoot使用jsoup爬取HTML

原文网址:SpringBoot使用jsoup爬取HTML_IT利刃出鞘的博客-CSDN博客

简介

本文介绍SpringBoot--使用jsoup(Java爬虫工具)的方法。

jsoup 是一款 Java 的 HTML 解析器,它提供了一套非常便利的 API,可通过 DOM、CSS 通过类似于 JQuery 的操作方法来取出和操作数据。

jsoup的主要功能

  1. 从一个URL、文件或字符串中解析HTML;
  2. 用DOM和css或类似jquery的selector语法获取Element,然后从从中获取节点属性、文本、html
  3. 对Element的进行操作,包括HTML的值、节点内容的值和设置节点属性的值;

引入依赖

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.4</version>
</dependency>

解析Document

Jsoup支持四种方式解析Document,即可以输入四种内容得到一个Document:

  1. 字符串
  2. body片段
  3. URL
  4. 文件

字符串解析示例

字符串中必须包含head和body元素。

String html = "<html><head><title>First parse</title></head>"+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

body片段解析

String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
// doc 此时为:<body> <p>Lorem ipsum.</p></body>Element body = doc.body();
System.out.println(body);

从URL解析

Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

还可以携带cookie等参数:

Document doc = Jsoup.connect("http://example.com").data("query", "Java").userAgent("Mozilla").cookie("auth", "token")// 自定义key和value.header("Content-Type", "application/json").timeout(3000).post();

从文件解析

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8");

选择元素

获取数据一共有 2 种方式,分别为 DOM方式、CSS选择器方式。

DOM方式

将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。

Document doc = Jsoup.connect("http://csdn.com").get();// 获取带有 href 属性的 a 元素
Elements elements = doc.select("a[href]");for (Element content : elements) {String linkHref = content.attr("href");String linkText = content.text();System.out.print(linkText + "\t");System.out.println(linkHref);
}

说明

Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:

查找元素

  1. getElementById(String id):通过id来查找元素
  2. getElementsByTag(String tag):通过标签来查找元素
  3. getElementsByClass(String className):通过类选择器来查找元素
  4. getElementsByAttribute(String key) :通过属性名称来查找元素,例如查找带有href元素的标签。
  5. siblingElements():获取兄弟元素。如果元素没有兄弟元素,则返回一个空列表。
  6. firstElementSibling():获取第一个兄弟元素。
  7. lastElementSibling():获取最后一个兄弟元素。
  8. nextElementSibling():获取下一个兄弟元素。
  9. previousElementSibling():获取上一个兄弟元素。
  10. parent():获取此节点的父节点。
  11. children():获取此节点的所有子节点。
  12. child(int index):获取此节点的指定子节点。

CSS选择器方式

可以使用类似于CSS选择器的语法来查找和操作元素,常用的方法为select(String selector)。

Document doc = Jsoup.connect("http://csdn.com").get();// 获取带有 href 属性的 a 元素
Elements elements = doc.select("a[href]");for (Element content : elements) {String linkHref = content.attr("href");String linkText = content.text();System.out.print(linkText + "\t");System.out.println(linkHref);
}

说明

  1. select()方法在Document、Element或Elements对象中都可以使用,而且是上下文相关的,因此可实现指定元素的过滤,或者采用链式访问。
  2. select() 方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。

链式访问示例

Document document = Jsoup.connect(URL).get();// URL是要爬取页面的链接
Elements elements = document.select("div.vsb-box").select("h2[class=cleafix]").select("a[href]");

获取数据

获得元素后,就可以获取元素中的数据。

方法有

  1. attr(String key):获取单个属性值
  2. attributes():获取所有属性值
  3. attr(String key, String value):设置属性值
  4. text():获取文本内容
  5. text(String value):设置文本内容
  6. html():获取元素内的HTML内容
  7. html(String value):设置元素内的HTML内容
  8. outerHtml():获取元素外HTML内容
  9. data():获取数据内容(例如:script和style标签)
  10. id():获得id值(例:<p id="goods">衣服</p>)
  11. className():获得第一个类选择器值
  12. classNames():获得所有的类选择器值
  13. tag():获取元素标签
  14. tagName():获取元素标签名(如:<p>、<div>等)
  15. .hasClass(String className):检查这个元素是否含有一个类选择器(不区分大小写)。
String html = "<p><a href='http://csdn.com/'><b>example</b></a> link.</p>";
Document doc  = Jsoup.parse(html);// 查找第一个<a>元素
Element link = doc.select("a").first();String text  = link.text();
// 输出:exampleString href = link.attr("href");
// 输出:http://csdn.com/String aHtml = link.outerHtml();
// 输出:<b>example</b>String aOuterHtml = link.outerHtml();
// 输出:<a href='http://csdn.com/'><b>example</b></a>

修改数据

解析了Document对象后,可能想修改其中的某些属性值,把它输出到前台页面或保存到其他地方,jsoup对此提供了一套非常简便的接口(支持链式写法)。

设置属性的值

以下方法针对Element对象操作时,只有一个元素会受到影响。当针对Elements对象进行操作时,会影响到多个元素。

  1. attr(String key, String value):设置标签的属性值。
  2. addClass(String className):增加类选择器选项
  3. removeClass(String className):删除对应的类选择器
Document doc = Jsoup.connect("http://csdn.com").get();Elements elements = doc.getElementsByClass("text");
// 复数,ElementsElement element = elements.first();
// 单数,Elementelements.attr("name","goods");
// 复数对象,所有 class="text" 的元素都将受到影响element.attr("name","shop").addClass("red");
// 单数对象,只有一个元素会受到影响(链式写法)

修改元素的HTML内容

  1. html(String value):这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。
  2. prepend(String value):在元素前添加html内容。
  3. append(String value):在元素后添加html内容。
  4. wrap(String value):对元素包裹一个外部HTML内容,将元素置于新增的内容中间。
Document doc = Jsoup.connect("http://csdn.com").get();Element div = doc.select("div").first();
div.html("<p>csdn</p>");
div.prepend("<p>a</p>");
div.append("<p>good</p>");
// 输出:<div"> <p>a</p> <p>csdn</p> <p>good</p> </div>Element span = doc.select("span").first();
span.wrap("<li><a href='...'></a></li>");
// 输出: <li><a href="..."> <span>csdn</span> </a></li>

修改元素的文本内容

对于传入的文本,如果含有像 <, > 等这样的字符,将以文本处理,而非HTML。

  1. text(String text) :清除元素内部的HTML内容,然后用提供的文本代替。
  2. prepend(String first):在元素后添加文本节点。
  3. Element.append(String last):在元素前添加文本节点。
Element div = doc.select("div").first();// <div></div>div.text(" one "); 
div.prepend(" two ");
div.append(" three ");
// 输出: <div> two one three </div>

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

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

相关文章

Java的基础数据类型有哪些?String是Java的基础数据类型吗?

目录 Java的基础数据类型有哪些&#xff1f; String是Java的基础数据类型吗&#xff1f; Java的基础数据类型有哪些&#xff1f; Java的基础数据类型是Java语言中预定义的几种基本的数据格式&#xff0c;它们在Java虚拟机&#xff08;JVM&#xff09;中有固定的内存占用和…

分享一个FreeSWITCH通道吊死的帖子

https://forum.signalwire.community/t/session-is-pending-when-shutdown-freeswitch/886/7 之前碰到过类似的情况&#xff0c;就是show channels能看到&#xff0c;但是uuid_kill <uuid>报错&#xff0c;说uuid不存在&#xff0c;或者叫僵尸通道 这人真正的问题是&am…

【最新】如何将idea上的项目推送到gitee

1.打开Gitee&#xff0c;在首页&#xff0c;点击“”&#xff0c;创建一个仓库 2.填写仓库基本信息 3.下拉&#xff0c;点击“创建”&#xff0c;出现下方页面&#xff0c;证明仓库创建成功。 4.打开idea&#xff0c;下载gitee的插件&#xff08;此处默认已经下载git&#xff0…

基于React, Redux实现的俄罗斯方块游戏及源码

分享一个俄罗斯方块游戏游戏框架使用的是 React Redux&#xff0c;其中再加入了 Immutable&#xff0c;用它的实例来做来Redux的state。&#xff08;有关React和Redux的介绍可以看 安装 npm install运行 npm start浏览自动打开 http://127.0.0.1:8080/ 打包编译 npm run …

T - SQL使用事务 及 在Winform使用事务

事务适用场景 1 事务使用在存储过程中&#xff0c;直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl&#xff1a;使用事务转账操作的实例 一般都会找一个变量记录错误的个数&#xff0c;error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…

自动化搭建初期必要的需求分析

1. 项目目标理解 与项目团队沟通&#xff1a;与项目经理、开发团队、产品经理等关键角色进行深入沟通&#xff0c;了解项目的整体目标和预期成果。理解业务需求&#xff1a;详细阅读项目文档&#xff0c;包括需求规格说明书、设计文档等&#xff0c;确保对业务逻辑和流程有深入…

selenium-激活pycharm,以及在pycharm中使用selenium时标红报错问题处理

激活pycharm&#xff1a;http://idea.955code.com/ 01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium&#xff1a; 解决方法: 在pycharm中通过设置或terminal面板重新安装s…

nosql的注入

一、SQL注入数据库分类 关系型数据库 mysql oracle sqlserver 非关系型数据库 key-value redis MongoDB&#xff08;not only sql&#xff09; 二、MongoDB环境搭建 自己官网下载 Download MongoDB Community Server | MongoDB 其中Mongod.exe是它的一个启动 加上数据库&…

本届挑战赛亚军方案:面向微服务架构系统中无标注、多模态运维数据的异常检测、根因定位与可解释性分析

CheerX团队来自于南瑞研究院系统平台研发中心&#xff0c;中心主要从事NUSP电力自动化通用软件平台的关键技术研究与软件研发。 选题分析 图1 研究现状 本次CheerX团队的选题紧密贴合了目前的运维现状。实际运维中存在多种问题导致运维系统的不可用。比如故障发生时&#xff…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

基于JAVAEE+Eclipse+Tomcat+Mysql开发的的停车场管理系统

基于JAVAEEEclipseTomcatMysql开发的的停车场管理系统 项目介绍&#x1f481;&#x1f3fb; 如今&#xff0c;我国现代化发展迅速&#xff0c;人口比例急剧上升&#xff0c;在一些大型的商场&#xff0c;显得就格外拥挤&#xff0c;私家车的数量越来越多&#xff0c;商场停车难…

【深度学习】Pytorch 教程(十四):PyTorch数据结构:6、数据集(Dataset)与数据加载器(DataLoader):自定义鸢尾花数据类

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

高性能图表组件LightningChart .NET v11.0发布——增强DPI感知能力

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…

华为---RSTP(四)---RSTP的保护功能简介和示例配置

目录 1. 技术背景 2. RSTP的保护功能 3. BPDU保护机制原理和配置命令 3.1 BPDU保护机制原理 3.2 BPDU保护机制配置命令 3.3 BPDU保护机制配置步骤 4. 根保护机制原理和配置命令 4.1 根保护机制原理 4.2 根保护机制配置命令 4.3 根保护机制配置步骤 5. 环路保护机…

php基础学习之错误处理(其二)

在实际应用中&#xff0c;开发者当然不希望把自己开发的程序的错误暴露给用户&#xff0c;一方面会动摇客户对己方的信心&#xff0c;另一方面容易被攻击者抓住漏洞实施攻击&#xff0c;同时开发者本身需要及时收集错误&#xff0c;因此需要合理的设置错误显示与记录错误日志 一…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员(root)申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#xff0c;并控制他们对系…

odoo17 | 核心组件 - 动作(Actions)

动作Actions 在Odoo中&#xff0c;动作&#xff08;Actions&#xff09;是系统的核心组件之一&#xff0c;负责定义系统响应用户交互的具体行为。动作定义了系统对用户操作的响应行为&#xff0c;例如登录、按钮点击、发票选择等。动作可以存储在数据库中或直接作为字典在按钮…

3D数字孪生

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…

从业务角度出发,实现UniApp二次开发的最佳实践

UniApp作为一款跨平台的移动应用开发框架&#xff0c;为开发者提供了在多个平台上构建应用的便利性。在这篇文章中&#xff0c;我们将深入探讨UniApp的二次开发&#xff0c;以及如何通过定制化来满足你的独特需求。 1.了解UniApp基础 1.1项目结构和文件 熟悉UniApp的项目结构…

动态规划(题目提升)

[NOIP2012 普及组] 摆花 方法一&#xff1a;记忆化搜索 何为记忆化搜素&#xff1a;就是使用递归函数对每次得到的结果进行保存&#xff0c;下次遇到就直接输出即可 那么这个题目使用递归&#xff08;DFS&#xff09;是怎样的&#xff1f; 首先我们需要搞清楚几个坑点&#x…