文档章节

Jsoup 数据抽取

羽落星辰
 羽落星辰
发布于 2017/05/31 17:29
字数 1824
阅读 7
收藏 0
点赞 0
评论 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)

© 著作权归作者所有

共有 人打赏支持
羽落星辰
粉丝 1
博文 61
码字总数 35802
作品 0
海淀
程序员
请教jsoup解析网页问题,感激不尽!!!

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

nicole_forever
2011/07/28
682
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
378
0
基于Jsoup的xpath实现--SipSoup

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

virjar
2017/06/16
173
0
jsoup 1.2.1 发布,HTML解析器

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。 该版本改进了对一些内容不完整的HTML的解析能力;增加了 .before(html) 和 .after(html) 方法;增加了 :has(el) 和...

红薯
2010/06/22
420
0
开源爬虫框架--WebPasser

WebPasser是一款可配置的开源爬虫框架,提供爬虫控制台管理界面,通过配置解析各类网页内容,无需写一句java代码即可抽取所需数据。 1.包含强大的页面解析引擎,提供jsoup、xpath、正则表达式...

hxt168
2016/06/08
2.8K
0
分布式爬虫框架 - xxl-crawler

分布式爬虫框架XXL-CRAWLER XXL-CRAWLER 是一个分布式爬虫框架。一行代码开发一个分布式爬虫,拥有"多线程、异步、IP动态代理、分布式、JS渲染"等特性; 特性 1、简洁:API直观简洁,可快速上...

许雪里
2017/11/03
0
6
HTML抽取器--Xsoup

Xsoup是基于Jsoup开发的HTML抽取器,提供了XPath支持。 相比另一个常用的基于XPath的HTML抽取器HtmlCleaner,Xsoup有较大的性能优势,解析时间和抽取时间都只有HtmlCleaner的一半。同时Xsoup...

黄亿华
2013/09/01
6.4K
5
jsoup实现微博登陆及发微博(带验证码)

城堡 前言 很早之前用别的语言写过一次微博登陆,现在改成java版,主要是为了验证jsoup的强大,一款完全可胜任http请求和html解析的工具。抓包,抽取js的方法这里就不在赘述。 工具 jsoup-1....

Ocly
2017/12/30
0
0
Jsoup抽取html内容,用的Element.text()方法,为什么抽取出来的内容没有标点符号呢?

对某一个百度百科的页面进行解析,为了拿到里面的主干内容。程序如下: public class TestJsoup2 { public static void main(String[] args) throws Exception { int id = 1009; File input ...

handyjuejue
2014/04/20
2.8K
5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
32分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部