Java使用Jsoup爬取数据

简介: 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 参考。

目录
相关文章
|
1月前
|
存储 Java 数据处理
|
1月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
24 1
|
2月前
|
存储 缓存 Java
保护隐私数据:使用Java `transient`关键字
保护隐私数据:使用Java `transient`关键字
32 0
|
3月前
|
安全 Java 容器
Dating Java8系列之用流收集数据
Dating Java8系列之用流收集数据
16 0
|
1月前
|
存储 算法 Java
Java中的集合框架:高效管理数据的关键
Java中的集合框架:高效管理数据的关键
16 0
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
359 1
|
1月前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
28 4
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
3天前
|
存储 Java
Java中利用BitMap位图实现海量级数据去重
Java中利用BitMap位图实现海量级数据去重
|
1月前
|
缓存 NoSQL Java
java中复杂业务情况下的集合操作(增减集合同步数据)
java中复杂业务情况下的集合操作(增减集合同步数据)
27 0