Java爬虫利器HTML解析工具-Jsoup
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(): 获取节点的idclassName(): 获取当前节点的class名称classNames(): 获取当前节点的所有class名称text(): 获取当前节点的textNode内容html(): 获取当前节点的 inner HTMLouterHtml(): 获取当前节点的 outer HTMLdata(): 获取当前节点的内容,用于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 href
Elements pngs = doc.select("img[src$=.png]"); // img with src ending .png
Element masthead = doc.select("div.masthead").first(); // div with class=masthead
Elements 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");
// 设置class
doc.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/Jsoupjar包下载地址: https://jsoup.org/downloadJsoupCSS选择器参考: https://jsoup.org/cookbook/extracting-data/selector-syntax
Java爬虫利器HTML解析工具-Jsoup的更多相关文章
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- Java爬虫系列三:使用Jsoup解析HTML
在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...
- 基于Java的简易表达式解析工具(一)
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
- 基于Java的简易表达式解析工具(二)
之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...
- (转载)Html解析工具Jsoup
jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTM ...
- 你必须掌握的Java基础:JSON解析工具-json-lib
一.简介 json-lib是一个Java类库,提供将Java对象,包括beans,maps,collections,java arrays和xml等转换成JSON,或者反向转换的功能. 二.准备 在 ...
- JSON语言规范与Java中两种解析工具基本使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html 一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...
- java 之 xml 之解析工具jaxp
一.jaxp的api查看 *jaxp是javase一部分 *jaxp解析器在jdk的javax.xml.parsers包里面 *共四个类:分别针对dom和sax解析使用的类 *dom解析类: Docu ...
- Java数学表示式解析工具- jeval
这个包能够为我们提高高效的数学表达式计算. 举个样例:这个是我们策划给出的游戏命中率的一部份计算公式 是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+3 ...
随机推荐
- C++贪心算法实现活动安排问题
问题描述: 设有n个活动的集合E={1,2,…,n},其中,每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且s ...
- js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值
这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...
- 攻防世界-web -高手进阶区-PHP2
题目 首先发现源码泄露 /index.phps 查看源代码 即: <?php if("admin"===$_GET[id]) { echo("<p>no ...
- 使用Hybris的customer coupon进行促销活动(promotion)
登录Backoffice,在Coupon菜单里创建一个新的类型为Customer Coupon的优惠券: 在菜单Marketing->Promotion Rules里,创建一条新的促销规则Pro ...
- 互联网企业级监控系统 OpenFalcon
Open-Falcon 人性化的互联网企业级监控系统,Open-Falcon 整体可以分为两部分,即绘图组件.告警组件.其中: 安装绘图组件 负责数据的采集.收集.存储.归档.采样.查询.展示(Das ...
- ELK+Logback进行业务日志分析查看
第1章 Elasticsearch安装部署 1.1 下载软件包并创建工作目录 程序下载地址:https://artifacts.elastic.co/downloads/elasticsearch/e ...
- Linux服务管理之SSH
Linux服务SSH ssh服务: 管理服务器的方式: 本地管理类 (安装系统,故障修复) SHH远程连接方式 ...
- python的multitask模块安装
今天参考网络上的例子,编写基于python的网络程序,遇到下面的错误. No module named 'multitask' 但是multitask的模块却始终下载不了,在网上找到的CSDN下载链接 ...
- Xcode添加库文件framework (转)
首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...
- 使用WIFI网卡 wpa_supplicant
在上篇文章中,编译了应用程序iw,它使得我们的开发板可以通过usb wifi网卡连接到无线热点,为了方便实验,我们采用了手机设置了无线热点.对手机的热点有4中安全方式:无WEPWPAWPA2使用iw工 ...