【转载】Java爬虫利器HTML解析工具-Jsoup
转自
https://www.cnblogs.com/youyoui/p/11065923.html
Jsoup简介
Java爬虫解析HTML文档的工具有:htmlparser
, Jsoup
。本文将会详细介绍Jsoup
的使用方法,10分钟搞定Java爬虫HTML解析。
Jsoup
可以直接解析某个URL地址、HTML文本内容,它提供非常丰富的处理Dom树的API。如果你使用过JQuery
,那你一定会非常熟悉。
Jsoup
最强大的莫过于它的CSS选择器支持了。比如:document.select("div.content > div#image > ul > li:eq(2)
。
包引入方法
Maven
添加下面的依赖声明即可,最新版本是(1.12.1)
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version></dependency>
Gradle
// jsoup HTML parser library @ https://jsoup.org/compile 'org.jsoup:jsoup:1.11.3'
源码安装
当然也可以直接把jar包下载下来,下载地址:https://jsoup.org/download
# git获取代码git clone https://github.com/jhy/jsoup.git
cd jsoup
mvn install# 下载代码curl -Lo jsoup.zip https://github.com/jhy/jsoup/archive/master.zip
unzip jsoup.zip
cd jsoup-master
mvn install
Jsoup解析方法
Jsoup
支持四种方式解析Document,即可以输入四种内容得到一个Document:
-
解析字符串
-
解析
body
片段 -
从一个URL解析
-
从一个文件解析
字符串解析示例
字符串中必须包含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);
HTML片段解析
String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.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")
.timeout(3000)
.post();
从文件解析
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Jsoup遍历DOM树的方法
使用标准的DOM方法
Jsoup
封装并实现了DOM里面常用的元素遍历方法:
-
根据id查找元素:
getElementById(String id)
-
根据标签查找元素:
getElementsByTag(String tag)
-
根据class查找元素:
getElementsByClass(String className)
-
根据属性查找元素:
getElementsByAttribute(String key)
-
兄弟遍历方法:
siblingElements()
,firstElementSibling()
,lastElementSibling()
;nextElementSibling()
,previousElementSibling()
-
层级之间遍历:
parent()
,children()
,child(int index)
这些方法会返回Element
或者Elements
节点对象,这些对象可以使用下面的方法获取一些属性:
-
attr(String key)
: 获取某个属性值 -
attributes()
: 获取节点的所有属性 -
id()
: 获取节点的id -
className()
: 获取当前节点的class名称 -
classNames()
: 获取当前节点的所有class名称 -
text()
: 获取当前节点的textNode内容 -
html()
: 获取当前节点的 inner HTML -
outerHtml()
: 获取当前节点的 outer HTML -
data()
: 获取当前节点的内容,用于script
或者style
标签等 -
tag()
: 获取标签 -
tagName()
: 获取当前节点的标签名称
有了这些API,就像JQuery
一样很便利的操作DOM。
强大的CSS选择器支持
你可能会说htmlparse
支持xpath
,可以很方便的定位某个元素,而不用一层一层地遍历DOM树。调用方法如下:
-
document.select(String selector)
: 选择匹配选择器的元素,返回是Elements
对象 -
document.selectFirst(String selector)
: 选择匹配选择器的第一个元素,返回是一个Element
对象 -
element.select(String selector)
: 也可以直接在Element
对象上执行选择方法
Jsoup
能够完美的支持CSS的选择器语法,可以说对应有前端经验的开发者来说简直是福音,不用特意去学习XPath的语法。
比如一个XPath: //*[@id="docs"]/div[1]/h4/a
, 可以转成等效的CSS选择器语法: document.select("#docs > div:eq(1) > h4 > a").attr("href");
。
看下面的示例:
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://baidu.com/");
Elements links = doc.select("a\[href\]"); // a with hrefElements pngs = doc.select("img\[src$=.png\]"); // img with src ending .pngElement masthead = doc.select("div.masthead").first(); // div with class=mastheadElements resultLinks = doc.select("h3.r > a"); // direct a after h3
下面列出一些常见的选择器:
-
标签选择(如
div
):tag
-
id选择(
#logo
):#id
-
class选择(
.head
):.class
-
属性选择(
[href]
):[attribute]
-
属性值选择:
[attr=value]
-
属性前缀匹配:
[^attr]
-
属性简单正则匹配:
[attr^=value], [attr$=value], [attr*=value], [attr~=regex]
另外还支持下面的组合选择器:
-
element#id
: (div#logo
: 选取id
为logo
的div
元素) -
element.class
: (div.content
: 选择class
包括content
的div
元素) -
element[attr]
: (a[href]
: 选择包含href
的a
元素) -
ancestor child
: (div p
: 选择div
元素的所有p后代元素) -
parent > child
: (p > span
: 选择p
元素的直接子元素中的span
元素) -
siblingA + siblingB
: (div.head + div
: 选取div.head
的下一个兄弟div
元素) -
siblingA ~ siblingX
: (h1 ~ p
: 选取h1
后面的所有p
兄弟元素) -
el, el, el
: (div.content, div.footer
: 同时选取div.content
和div.footer
)
当然,还支持伪元素选择器:
-
:lt(n)
: (div#logo > li:lt(2)
: 选择id
为logo
的div
元素的前3个li
子元素) -
:gt(n)
-
:eq(n)
-
:has(selector)
-
:not(selector)
-
:contains(text)
详细可参考官方选择器语法文档: https://jsoup.org/cookbook/extracting-data/selector-syntax
Jsoup修改DOM树结构
当然Jsoup
还支持修改DOM树结构,真的很像JQuery
。
// 设置属性doc.select("div.comments a").attr("rel", "nofollow");// 设置classdoc.select("div.masthead").attr("title", "jsoup").addClass("round-box");
下面的API可以直接操作DOM树结构:
-
text(String value)
: 设置内容 -
html(String value)
: 直接替换HTML结构 -
append(String html)
: 元素后面添加节点 -
prepend(String html)
: 元素前面添加节点 -
appendText(String text)
,prependText(String text)
-
appendElement(String tagName)
,prependElement(String tagName)
参考文档
-
Jsoup
官网地址: https://jsoup.org/ -
Jsoup
官网指导文档: https://jsoup.org/cookbook/ -
Jsoup
jar包下载地址: https://jsoup.org/download -
Jsoup
CSS选择器参考: https://jsoup.org/cookbook/extracting-data/selector-syntax
咦!你居然读完了!
有收获吗?觉得不错的话,不要忘了点赞和关注哦!
欢迎到我的个人博客参观哦!
地 址 :https://www.cnblogs.com/xiaqiuchu/articles/15228377.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义