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解析
  • 从一个文件解析

字符串解析示例

字符串中必须包含headbody元素。

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里面常用的元素遍历方法:

  • getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key) (and related methods)
  • Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
  • Graph: 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 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: 选取idlogodiv元素)
  • element.class: (div.content: 选择class包括contentdiv元素)
  • element[attr]: (a[href]: 选择包含hrefa元素)
  • 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.contentdiv.footer)

当然,还支持伪元素选择器:

  • :lt(n): (div#logo > li:lt(2): 选择idlogodiv元素的前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)

参考文档

原文地址:https://www.cnblogs.com/youyoui/p/11063654.html

时间: 2024-10-10 07:38:24

Java爬虫利器HTML解析工具-Jsoup的相关文章

基于Java的简易表达式解析工具(二)

之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处理的工具类什么的. 这个Java的表达式解析的工具只用了5个类,而且写得也很简单明了,相信有一些编程经验的可以看懂这些处理的逻辑代码. 1.第一个类:ExpressionNodeType(表达式各个字符节点的类型枚举类) public enum ExpressionNodeType { Unknow

Java数学表示式解析工具- jeval

这个包可以为我们提高高效的数学表达式计算. 举个例子:这个是我们策划给出的游戏命中率的一部份计算公式 是否命中=a命中率 – (b等级 – a等级) * (命中系数(6)* b闪避率 / 100)+32 为了好看点,我们把他变成:ahit-(blv-alv)*(6*beva/100)+32 Jeval就是用在这种情况下的!!!! Jeval下载地址:http://www.oschina.net/p/jeval 目前最新版本是0.9.4 Beta public class EvalTest { p

初识Java爬虫之Jsoup,提供参考代码

本文主要分享的是关于Java爬虫技术其中一个方式   ==>  Jsoup 1.Jsoup简介 推开技术大门,爬虫技术琳琅满目,而今天要分享的Jsoup是一款Java的HTML解析神器,,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API.可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. .关于Jsoup的详细介绍,不赘述,以下是 官方文档,自行查阅.我们直接上代码. 2.代码分享(真实爬取一个政府采购网:中国政府采购网,按照关键词搜索的公告) 注意的

Java:JSON解析工具-org.json

一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用. 2.查看相关的API文档,访问:https://github.com/douglascrockford/JSON-java. https

Java爬虫项目实战(一)

目的: 通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) .市(City).县(County).镇(town).村委会(village) 主网站链接: http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2015/index.html 主要jar包: http://jsoup.org/packages/jsoup-1.8.1.jar 之前一节我们说过java爬虫从网络上利用jsoup获取网页文本,也就是说我们可以有三种方法获取h

Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲

在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天就来实战下,用他们来抓取酷狗音乐网上的 Top500排行榜音乐.接下来的代码中除了会用到HttpClient和Jsoup之外,还会用到log4j和ehcache,分别用来记录日志和实现缓存,如果看官对这两个不是很熟悉的话,请自行百度,现在网上的入门实例有很多,我就不专门记笔记了. 那为什么会想到爬取

JSON解析工具-org.json使用教程

原文地址:http://www.open-open.com/lib/view/open1381566882614.html 一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用. 2.查看相关

Java 爬虫工具Jsoup解析

Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据. jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML: 2. 使用 DOM 或 CSS 选择器来查找.取出数据: 3. 可操作 HTML 元素.属性.文本: jsoup 是基于 MIT 协议发布的,可放心使用于商业项目. jsoup 可以从包括字符串.URL

Java爬虫框架SeimiCrawler的工程自动打包工具使用

为了便于开发者对使用SeimiCrawler框架开发的爬虫工程的打包部署,SeimiCrawler现已推出maven-seimicrawler-plugin,一个maven工程的自动化打包插件.下面简要介绍下他的使用. 开始 pom添加添加plugin <plugin> <groupId>cn.wanghaomiao</groupId> <artifactId>maven-seimicrawler-plugin</artifactId> <