文档章节

Jsoup 数据抽取

风雪满弓刀
 风雪满弓刀
发布于 2017/05/31 17:29
字数 1824
阅读 23
收藏 0

数据抽取

1 使用DOM方法来遍历一个文档

有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。


File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

说明 :Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。

1.1查找元素

属性

操作 含义
getElementById(String id) id
getElementsByTag(String tag) 标签名
getElementsByClass(String className) class名
getElementsByAttribute(String key)
siblingElements() 所有的兄弟元素
firstElementSibling() 第一个兄弟元素
lastElementSibling() 最后一个兄弟元素
nextElementSibling() 下一个兄弟元素
previousElementSibling() 上一个兄弟元素
parent() 获取该元素父节点
children() 获取该元素的子元素
child(int index) 获取该元素的第几个子元素(下标从0开始)

1.2 元素数据

操作 含义
attr(String key) 获取属性
attr(String key, String value) 设置属性
attributes() 获取所有属性
id() 获取该元素id
className() 获取该元素class,多个class之间空格隔开
classNames() 获取所有元素的class
text() 获取文本内容
text(String value) 设置文本内容
html() 获取元素内HTML
html(String value) 设置元素内的HTML内容
outerHtml() 获取元素外HTML内容
data() 获取数据内容(例如:script和style标签)
tag()  
tagName() 获取元素标签名

1.3 操作HTML和文本

操作 含义
append(String html) 添加给定的html到元素末尾
prepend(String html) 添加给定html到元素前面
appendText(String text) 创建并添加文本
prependText(String text) 创建并添加文本
appendElement(String tagName) 添加到元素末尾
prependElement(String tagName) 添加到元素前
html(String value) 设置元素值

2 使用选择器语法来查找元素(select)

使用 Element.select(String selector) 和 Elements.select(String selector),使用类似于CSS或jQuery的语法来查找和操作元素。

    File input = new File("/tmp/input.html");
    Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
    Elements links = doc.select("a[href]"); //带有href属性的a元素
    Elements pngs = doc.select("img[src$=.png]"); //扩展名为.png的图片
    Element masthead = doc.select("div.masthead").first();//class等于masthead的div标签
    Elements resultLinks = doc.select("h3.r > a"); //在h3元素之后的a元素

说明: 
jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。Select在DocumentElement,或Elements 对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。Select方法将返回一个Elements 集合,并提供一组方法来抽取和处理结果

2.1 Select 选择器 简单用法

操作 含义
tagname 使用标签名来定位,例如 a
ns|tag 使用命名空间的标签定位,例如 fb:name 来查找 <fb:name> 元素
#id 使用元素 id 定位,例如 #logo
.class 使用元素的 class 属性定位,例如 .head
[attribute] 使用元素的属性进行定位,例如 [href] 表示检索具有 href 属性的所有元素
[^attr] 使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5 的 dataset 属性
[attr=value] 使用属性值进行定位,例如 [width=500] 定位所有 width 属性值为 500 的元素
[attr^=value], [attr$=value], [attr*=value] 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex] 利用属性值匹配正则表达式来查找元素,例如img[src~=(?i).(png|jpe?g)]
* 定位所有元素

2.2 Selector选择器 组合使用

操作 含义
el#id 定位 id 值某个元素,例如 a#logo -> <a id=logo href= … >
el.class 定位 class 为指定值的元素,例如 div.head -> <div class=head>xxxx</div>
el[attr] 定位所有定义了某属性的元素,例如 a[href]
以上三个任意组合 例如 a[href]#logo 、a[name].outerlink
ancestor child 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 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

2.3 伪选择器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(p)表示哪些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) 使用正则表达式找到自身的文本

3 从元素抽取属性,文本和HTML

操作 含义
Node.attr(String key)  获取属性值
Element.text()  获取元素中的文本值
Element.html()  获取元素HTML内容
Node.outerHtml()  获取元素HTML内容

使用

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
Element link = doc.select("a").first();//查找第一个a元素

String text = doc.body().text(); // "An example link"//取得字符串中的文本
String linkHref = link.attr("href"); // "http://example.com/"//取得链接地址
String linkText = link.text(); // "example""//取得链接地址中的文本

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"//取得链接内的html内容

4.处理URLs

   有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs。

  1. 在解析文档时确保有指定baseURI
  2. 然后使用abs属性性前缀来取得包含baseURI的绝对路径
Document doc = Jsoup.connect("http://www.open-open.com").get();

Element link = doc.select("a").first();
String relHref = link.attr("href"); // == "/"
String absHref = link.attr("abs:href"); // "http://www.open-open.com/"

说明: 
在HTML元素中,URLs经常写成相对于文档位置的相对路径: <a href="/download">...</a>. 当你使用 Node.attr(String key) 方法来取得a元素的href属性时,它将直接返回在HTML源码中指定的值。

假如你需要取得一个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href"),因此,在解析HTML文档时,定义baseURI非常重要。

如果你不想使用abs: 前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)

© 著作权归作者所有

共有 人打赏支持
上一篇: Jsoup 数据修改
下一篇: Jsoup 解析框架
风雪满弓刀
粉丝 1
博文 62
码字总数 35930
作品 0
海淀
程序员
私信 提问
请教jsoup解析网页问题,感激不尽!!!

我想用jsoup抽取html的数据,并对数据做适当改变,然后还原: 1、请问有什么好的方法,在抽取数据的同时保存数据位置 2、请问通过什么办法可以把数据还原成网页格式 感谢各位热心的高手们指点...

nicole_forever
2011/07/28
818
1
使用Jsoup解析html网页

一、 JSOUP简介 在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库。现在我们有了JSOUP,以后的处理HTML的内容只需要...

神剑戎
2013/05/01
0
1
SipSoup 1.3 发布,基于 JSoup 的 Xpath 抽取器

SipSoup是一个基于JSoup的Xpath抽取器,他将JSoup的css Query语法和Xpath语法糅合在一起,支持在xpath内部实现他们之间的混合链式调用。同时SipSoup支持方便的自定义扩展,允许重写函数,轴,...

virjar
2017/06/26
420
0
XXL-CRAWLER v1.2.1 发布,分布式爬虫框架

版本新特性 JS渲染:支持JS渲染方式采集数据,可参考 "爬虫示例6"; 抽象并设计PageLoader,方便自定义和扩展页面加载逻辑,如JS渲染等。底层提供 "JsoupPageLoader(默认/推荐)","HtmlUnit...

许雪里
02/08
1K
18
基于Jsoup的xpath实现--SipSoup

sipsoup是一个基于Jsoup的xpath实现,他将Jsoup的cssQuery变成了xpath语法的一部分,可以实现在xpath内部执行cssQuery和xpath混合模式的链式文档查询 是一款纯Java开发的使用xpath解析html的...

virjar
2017/06/16
173
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
17分钟前
0
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
33分钟前
2
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部