【Java爬虫】Jsoup
官网
中文使用手册
jsoup.jar官网下载
jsoup.jar百度网盘下载 提取码:g6ek
jsoup是一款Java的HTML解析器,主要用来对HTML解析,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
Jsoup的主要类
org.jsoup.Jsoup类
Jsoup类是任何Jsoup程序的入口点,并将提供从各种来源加载和解析HTML文档的方法,Jsoup类的一些重要方法如下:
org.jsoup.nodes.Document类:
该类表示通过Jsoup库加载HTML文档。可以使用此类执行适用于整个HTML文档的操作。Document类的重要方法参见:http://jsoup.org/apidocs/org/jsoup/nodes/Document.html,Document类的常用方法如下所示:
org.jsoup.nodes.Element类:
HTML元素是由标签名称,属性和子节点组成。 使用Element类可以提取数据,遍历节点和操作HTMLElement类的重要方法可以参见 :http://jsoup.org/apidocs/org/jsoup/nodes/Element.html,Element类常用方法如下所示:
准备工作
创建一个Jsoup工程,目录结构如下:
要添加jsoup的jar包,放到了百度网盘里,版本是:jsoup-1.11.3
爬取内容案例
爬取网页内容
从URL加载文档,使用Jsoup.connect()
方法从URL加载
待爬取的页面信息如下图:
代码为:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;/*** 获取 http://www.ygdy8.net/html/gndy/index.html 页面的“国内电影下载排行“*/
public class JsoupDemo {public static void main(String[] args) {//URLLoader 是一个静态方法,可以通过类名直接调用JsoupDemo.URLLoader("http://www.ygdy8.net/html/gndy/index.html");}public static void URLLoader(String url){Document d1;try {//通过Jsoup类中的静态方法connect返回Document对象,该document对象实际为整个html页面内容。d1 = Jsoup.connect(url).get();System.out.println("网页的标题是:" + d1.title() + "\n");/*** 1. 分析网页结构,发现我们想要的国内电影下载排行榜,所对应的class样式为co_content2,* 2. 可以通过属性、后代选择器选中元素" div[class=‘co_content2’] ul a" ,然* 3. 后通过Element类中的text()方法获取文本内容*/Elements es = d1.select("div[class='co_content2'] ul a");//遍历得到的结果并输出内容for (Element e : es){System.out.println(e.text());}} catch (IOException e) {e.printStackTrace();}}
}
爬取文档内容
从文件加载文档,使用Jsoup.parse()
方法从文件加载HTML
待爬取的页面如下,是我本地路径下的一个html文档
代码为:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;/*** 从本地文件加载文档,获取淘宝主营区域包括哪些方面 文件路径为: C:\Users\vsue\Desktop\taobao.html*/
public class JsoupDocDemo {public static void main(String[] args) {JsoupDocDemo.LocLoader("C:\\Users\\vsue\\Desktop\\taobao.html");}public static void LocLoader(String address) {Document d2;try {//从文件加载文档,使用`Jsoup.parse()`方法从文件加载HTMLd2 = Jsoup.parse(new File(address), "utf-8");System.out.println(d2.title());Elements es = d2.select("ul[class='service-bd'] li a");for (Element e : es){System.out.println(e.text());}} catch (IOException e) {e.printStackTrace();}}
}
结果为:
爬取String的内容
从String加载文档,使用Jsoup.parse()方法从字符串加载HTML
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;public class JsoupStrDemo {public static void main(String[] args) {String html = "<html>"+ "<head>"+ "<title>First parse</title>"+ "</head>"+ "<body>"+ "<p>Parsed HTML into a doc.</p>"+ "<a href='http://www.baidu.com'>百度一下</a>"+ "</body>"+ "</html>";JsoupStrDemo.StringLoader(html);}public static void StringLoader(String html){//从String加载文档,使用Jsoup.parse()方法从字符串加载HTMLDocument d3 = Jsoup.parse(html);String url = d3.select("a").attr("href");System.out.println(d3.title()+" "+url);}
}
结果:
获取页面所有链接
一个页面中往往包含大量的url,跳转到不同的界面,接下来定义方法获取京东主页面所有url
爬取页面中所有<a>
标签,然后遍历即可
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;/*** 获取HTML页面中的所有链接*/
public class JsoupAllUrlDemo {public static void main(String[] args) {JsoupAllUrlDemo.allUrlLoader("https://www.jd.com/");}public static void allUrlLoader(String address){Document d4;try {d4 = Jsoup.connect(address).get();//links包含了页面所有的连接Elements links = d4.select("a[href]");for (Element link : links) {System.out.println("text : " + link.text()+"---》link : " + link.attr("href"));}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
解析一个body片段
办法
使用Jsoup.parseBodyFragment(String html)方法.
String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
说明
parseBodyFragment
方法创建一个空壳的文档,并插入解析过的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html)
方法,通常你也可以得到相同的结果,但是明确将用户输入作为 body片段处理,以确保用户所提供的任何糟糕的HTML都将被解析成body元素。
Document.body()
方法能够取得文档body元素的所有子元素,与 doc.getElementsByTag("body")
相同。
数据抽取
DOM方法遍历文档
将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。示例代码:
说明
Elements这个对象提供了一系列类似于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)
元素数据
- attr(String key)获取属性attr(String key, String value)设置属性
attributes()获取所有属性 - id(), className() and classNames()
- text()获取文本内容text(String value) 设置文本内容
- html()获取元素内HTMLhtml(String value)设置元素内的HTML内容
- outerHtml()获取元素外HTML内容
- data()获取数据内容(例如:script和style标签)
- tag() and tagName()
操作HTML和文本
- append(String html), prepend(String html)
- appendText(String text), prependText(String text)
- appendElement(String tagName), prependElement(String tagName)
- html(String value)
使用选择器语法来查找元素
方法
可以使用Element.select(String selector)
和 Elements.select(String selector)
方法实现查找和操作元素:
jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.
这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。
select
方法将返回一个Elements
集合,并提供一组方法来抽取和处理结果。
Selector选择器概述
tagname
: 通过标签查找元素,比如:a
ns|tag
: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找<fb:name>
元素#id
: 通过ID查找元素,比如:#logo
.class
: 通过class名称查找元素,比如:.masthead
[attribute]
: 利用属性查找元素,比如:[href]
[^attr]
: 利用属性名前缀来查找元素,比如:可以用[^data-]
来查找带有HTML5 Dataset属性的元素[attr=value]
: 利用属性值来查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]
: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]
: 利用属性值匹配正则表达式来查找元素,比如:img[src~=(?i)\.(png|jpe?g)]
*
: 这个符号将匹配所有元素
Selector选择器组合使用
el#id
: 元素+ID,比如: div#logoel.class
: 元素+class,比如: div.mastheadel[attr]
: 元素+class,比如: a[href]任意组合
,比如:a[href].highlightancestor child
: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 p元素parent > child
: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素siblingA + siblingB
: 查找在A元素之前第一个同级元素B,比如:div.head + divsiblingA ~ siblingX
: 查找A元素之前的同级X元素,比如:h1 ~ pel, el, el
:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo
伪选择器selectors
:lt(n)
: 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素:gt(n)
:查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素:eq(n)
: 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素:has(seletor)
: 查找匹配选择器包含元素的元素,比如:div:has§表示哪些div包含了p元素:not(selector)
: 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表:contains(text)
: 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup):containsOwn(text)
: 查找直接包含给定文本的元素:matches(regex)
: 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login):matchesOwn(regex)
: 查找自身包含文本匹配指定正则表达式的元素
注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等
可以查看Selector API参考来了解更详细的内容
从元素抽取属性,文本和HTML
在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。
方法:
- 要取得一个属性的值,可以使用
Node.attr(String key)
方法 - 对于一个元素中的文本,可以使用
Element.text()
方法 - 对于要取得元素或属性中的HTML内容,可以使用
Element.html()
, 或Node.outerHtml()
方法
上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:
Element.id()
Element.tagName()
Element.className()
andElement.hasClass(String className)
这些访问器方法都有相应的setter方法来更改数据.
修改数据
问题
在你解析一个Document之后可能想修改其中的某些属性值,
然后再保存到磁盘或都输出到前台页面。
方法
可以使用属性设置方法 Element.attr(String key, String value)
, 和 Elements.attr(String key, String value)
.
假如你需要修改一个元素的 class 属性,可以使用 Element.addClass(String className)
和 Element.removeClass(String className)
方法。
Elements 提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个 rel=“nofollow” 可以使用如下方法:
doc.select("div.comments a").attr("rel", "nofollow");
说明
与Element中的其它方法一样, attr 方法也是返回当 Element (或在使用选择器是返回 Elements 集合)。这样能够很方便使用方法连用的书写方式。比如:
doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");
设置一个元素的HTML内容
说明
Element.html(String html)
这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。Element.prepend(String first)
和Element.append(String last)
方法用于在分别在元素内部HTML的前面和后面添加HTML内容Element.wrap(String around)
对元素包裹一个外部HTML内容。
设置元素的文本内容
方法
可以使用Element的设置方法修改一个HTML文档中的文本内容:
说明
文本设置方法与 HTML setter 方法一样:
Element.text(String text)
将清除一个元素中的内部HTML内容,然后提供的文本进行代替Element.prepend(String first)
和Element.append(String last)
将分别在元素的内部html前后添加文本节点。
对于传入的文本如果含有像 <, > 等这样的字符,将以文本处理,而非HTML。
【Java爬虫】Jsoup相关推荐
- java爬虫---Jsoup
简单易懂的java爬虫-Jsoup 做个简单的Demo,爬取酒店的基本信息,酒店名称.酒店地址.酒店星级.酒店的图片等.这里考虑在哪个网站爬取这些数据呢?第一个想到的就是X程上. Jsoup爬取的是网 ...
- java爬虫(jsoup)实现搜狗图片一键下载
java爬虫(jsoup)实现搜狗图片一键下载 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.no ...
- java爬虫解析script_详解java爬虫jsoup解析多空格class数据
在使用jsoup爬取其他网站数据的时候,发现class是带空格的多选择,如果直接使用doc.getElementsByClass("class的值"),这种方法获取不到想要的数据. ...
- 采集 58同城 房产数据信息 | Java爬虫 Jsoup
一个数据采集系统(通俗的说就是爬虫),用来采集 58同城 房产 | 郑州中的房屋数据.使用 Java 语言和Jsoup库编写,这里分享给大家. 最后采集的数据结果 CSV 文件保存的,如下所示 说明 ...
- java jsoup 网络爬虫 jsoup解析html Java爬虫 Jsoup爬虫 jsoup例子
java jsoup 网络爬虫 java jsoup 网络爬虫 学习例子(一)抓取豆瓣电影名称+推荐星级 java jsoup 网络爬虫 学习例子(二)只抓取豆瓣电影5星(力荐)电影名称 java j ...
- JAVA爬虫Jsoup,抓取房价
里面的命名很烂,但能跑出来效果. 依赖: <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependenc ...
- Java爬虫Jsoup的使用
Jsoup的使用 0. Jsoup介绍 1. Get请求 2. Post请求 3. 通过document获取元素 4. 练习Demo 练习1 练习2:获取所有图片 练习3获取商品 练习4 下载图片 5 ...
- Java爬虫Jsoup简易使用
一.准备工作 1.下载jsoup工具,如果是maven项目,请在pm.xml中加入以下代码: jsoup虽然不是一个很强大的爬虫工具,但是它对于网页html文档的各种处理确实是很强大的,同时自身也是个 ...
- JAVA爬虫-Jsoup + JsoupXPath
JsoupXPath是基于Jsoup的拓展,使用路径的形式解析XML和HTML文档.核心类为JXDocument.JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点. ...
- Java爬虫之利用Jsoup自制简单的搜索引擎
Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据.Jso ...
最新文章
- 基于visual Studio2013解决面试题之0804复杂链表
- 今日 Paper | 跨模态行人重识别;对抗时尚迁移;学会注意错误等
- Unity光照与渲染设置学习笔记
- C++获取windows桌面的路径
- Codeforces 1093C (思维+贪心)
- JS中使用bignumber处理高精度小数运算
- 免费下载百度 豆丁 丁香 等平台文档
- gis 数据框裁剪_【更新84篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 概率论(三)-多维随机变量及其分布:n维随机变量、概率分布函数F(x1,x2,..xn)、联合分布律、联合概率密度、边缘分布律、边缘概率密度、条件分布律、条件概率密度、β函数、Γ函数、max{X,Y}
- 练习二:工作日天气预报
- Google Voice 语音搜索
- 2020 几款常用 Redis 可视化工具
- 5种常见的重复形式,平面设计手法进阶学习
- PDF文件有编辑权限,怎么编辑PDF文件?
- 完美日记母公司逸仙电商发布Q4财报净亏损同比收窄42.5%
- r语言boxcox异方差_基于R语言进行Box-Cox变换
- CIA真是无孔不入 2012年起它们就开始通过路由器搞监控了
- krpano教程:Videoplayer插件中文说明
- 数据分析模型篇—SWOT分析
- 对于vector中高效删除中间元素的技巧
热门文章
- win10系统打开更新服务器失败怎么回事,如何修复Windows Update组件以解决Win10无法自动更新的问题?...
- EXCEL VBA 备忘录
- 使用python批量提取txt中的数据并写入excel
- oracle新建用户并授权视图
- java编程实现求回文数_Java编程之回文数
- Word 域嵌套太深弹窗,更新域卡顿,解决办法
- 利用ipv6技术,废旧笔记本变成互联网server
- php获得客户端ip地址范例
- 谈谈C++中的swap函数
- 迪思杰支持mysql_迪思杰Oracle数据库复制产品