Java使用Jsoup爬取数据

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Java使用Jsoup爬取数据

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

jsoup的主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本

解析和遍历Document

String html = "<html><head><title>First parse</title></head>"

   + "<body><p>Parsed HTML into a doc.</p></body></html>";


Document doc = Jsoup.parse(html);String html = "<html><head><title>First parse</title></head>"

   + "<body><p>Parsed HTML into a doc.</p></body></html>";


Document doc = Jsoup.parse(html);

解析器将尽一切努力从您提供的 HTML 中创建干净的解析,无论 HTML 是否格式正确。例如:

  • 未闭合的标签(例如<p>Lorem <p>Ipsum解析为<p>Lorem</p> <p>Ipsum</p>
  • 隐式标签(例如,裸标签<td>Table data</td>被包裹在 a 中<table><tr><td>...
  • 可靠地创建文档结构(html包含一个headbody,并且只在头部中包含适当的元素)

文档的对象模型

  • 文档由 Elements 和 TextNodes 组成(以及其他一些杂项节点:请参阅节点包树)。
  • 继承链是:Document extends Element extends NodeTextNode延伸Node
  • 一个元素包含一个子节点列表,并且有一个父元素。他们还提供了仅过滤的子元素列表。

使用 DOM 方法导航Document

问题

您有一个要从中提取数据的 HTML 文档。您大致了解 HTML 文档的结构。

解决方案

Jsoup中的Elements 提供了一系列类似 DOM 的方法来查找元素,并提取和操作它们的数据。 DOM getter 是上下文相关的:在父 Document 上调用它们会在文档下找到匹配的元素; 调用一个子元素,他们会在该子元素下找到元素。 通过这种方式,您可以筛选出您想要的数据。

寻找元素

  • getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key)
  • 兄弟元素:
  • siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(),previousElementSibling()
  • 其他:parent(), children(),child(int index)

元素数据

  • attr(String key)获取和attr(String key, String value)设置属性
  • attributes()获取所有属性
  • id(),className()classNames()
  • text()获取和text(String value)设置文本内容
  • html()获取和html(String value)设置内部 HTML 内容
  • outerHtml()获取外部 HTML 值
  • data()获取数据内容(例如 scriptstyle标签)
  • tag()tagName()

处理 HTML 和文本

  • append(String html),
  • prepend(String html)
  • appendText(String text),
  • prependText(String text)
  • appendElement(String tagName),
  • prependElement(String tagName)
  • html(String value)

api文档:https://jsoup.org/apidocs/org/jsoup/nodes/Element.html#getElementsByTag(java.lang.String)

使用选择器语法查找元素

问题

您想使用 CSS 或类似 jquery 的选择器语法来查找或操作元素。

描述

jsoup 元素支持类似于CSS(或jquery)的选择器语法来查找匹配元素,这允许非常强大和健壮的查询。

select方法在DocumentElement或 中可用Elements它是上下文相关的,因此您可以通过从特定元素中进行选择或通过链接选择调用来进行过滤。

Select 返回一个元素列表 (asElements),它提供了一系列方法来提取和操作结果。

       Document doc = Jsoup.connect(src).get();

       Elements elements = doc.select("div.item");        Document doc = Jsoup.connect(src).get();

       Elements elements = doc.select("div.item");

选择器概述

  • tagname: 按标签查找元素,例如a
  • ns|tag: 在命名空间中按标签查找元素,例如fb|name查找<fb:name>元素
  • #id: 按 ID 查找元素,例如#logo
  • .class: 按类名查找元素,例如.masthead
  • [attribute]: 具有属性的元素,例如[href]
  • [^attr]: 具有属性名称前缀的[^data-]元素,例如查找具有 HTML5 数据集属性的元素
  • [attr=value]: 具有属性值的元素,例如[width=500](也可以引用,比如[data-name='launch sequence']
  • [attr^=value],[attr$=value],[attr*=value]: 具有以值开头、结尾或包含值的属性的元素,例如[href*=/path/]
  • [attr~=regex]: 属性值与正则表达式匹配的元素;例如img[src~=(?i)\.(png|jpe?g)]
  • *: 所有元素,例如*

选择器组合

  • el#id: 带有 ID 的元素,例如div#logo
  • el.class:具有类的元素,例如div.masthead
  • el[attr]: 具有属性的元素,例如a[href]
  • 任何组合,例如a[href].highlight
  • ancestor child: 继承自祖先的子元素,例如在具有“body”类的块下的任何位置.body p查找元素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

伪选择器

  • :lt(n): 查找兄弟索引(即其在 DOM 树中相对于其父级的位置)小于的元素n例如td:lt(3)
  • :gt(n): 查找兄弟索引大于的元素n例如div p:gt(2)
  • :eq(n):查找兄弟索引等于的元素n例如form input:eq(1)
  • :has(selector):查找包含与选择器匹配的元素的元素;例如div:has(p)
  • :not(selector):查找与选择器不匹配的元素;例如div:not(.logo)
  • :contains(text):查找包含给定文本的元素。搜索不区分大小写;例如p:contains(jsoup)
  • :containsOwn(text): 查找直接包含给定文本的元素
  • :matches(regex): 查找文本与指定正则表达式匹配的元素;例如div:matches((?i)login)
  • :matchesOwn(regex): 查找自身文本与指定正则表达式匹配的元素
  • 请注意,上述索引伪选择器是从 0 开始的,即第一个元素在索引 0 处,第二个在 1 处,依此类推

Selector有关完整支持的列表和详细信息,请参阅API 参考。

目录
相关文章
|
6天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
26天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
36 6
|
25天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
79 3
|
6天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
18 2
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
11天前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
32 2
|
17天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
35 2
|
21天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
26天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
34 2
|
18天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
10 0