文档章节

Jsoup代码解读之一-概述

黄亿华
 黄亿华
发布于 2013/08/25 21:13
字数 776
阅读 4637
收藏 40

今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学学好东西吧!

Jsoup是Java世界用作html解析和过滤的不二之选。支持将html解析为DOM树、支持CSS Selector形式选择、支持html过滤,本身还附带了一个Http下载器。从今天开始会写一个Jsoup源码解读系列,比起之前的博客,尽量会写的详尽一些。

概述

Jsoup的代码相当简洁,Jsoup总共53个类,且没有任何第三方包的依赖,对比最终发行包9.8M的SAXON,实在算得上是短小精悍了。

jsoup
├── examples #样例,包括一个将html转为纯文本和一个抽取所有链接地址的例子。    
├── helper #一些工具类,包括读取数据、处理连接以及字符串转换的工具
├── nodes #DOM节点定义
├── parser #解析html并转换为DOM树
├── safety #安全相关,包括白名单及html过滤
└── select #选择器,支持CSS Selector以及NodeVisitor格式的遍历

使用

Jsoup的入口是Jsoup类。examples包里提供了两个例子,解析html后,分别用CSS Selector以及NodeVisitor来操作Dom元素。

这里用ListLinks里的例子来说明如何调用Jsoup:

<!-- lang: java -->
public static void main(String[] args) throws IOException {
    Validate.isTrue(args.length == 1, "usage: supply url to fetch");
    String url = args[0];
    print("Fetching %s...", url);

    // 下载url并解析成html DOM结构
    Document doc = Jsoup.connect(url).get();
    // 使用select方法选择元素,参数是CSS Selector表达式
    Elements links = doc.select("a[href]");

    print("\nLinks: (%d)", links.size());
    for (Element link : links) {
        //使用abs:前缀取绝对url地址
        print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
    }
}

Jsoup使用了自己的一套DOM代码体系,这里的Elements、Element等虽然名字和概念都与Java XML APIorg.w3c.dom类似,但并没有代码层面的关系。就是说你想用XML的一套API来操作Jsoup的结果是办不到的,但是正因为如此,才使得Jsoup可以抛弃xml里一些繁琐的API,使得代码更加简单。

还有一种方式是通过NodeVisitor来遍历DOM树,这个在对整个html做分析和替换时比较有用:

<!-- lang: java -->
public interface NodeVisitor {

    //遍历到节点开始时,调用此方法
    public void head(Node node, int depth);

    //遍历到节点结束时(所有子节点都已遍历完),调用此方法
    public void tail(Node node, int depth);
}

HtmlToPlainText的例子说明了如何使用NodeVisitor来遍历DOM树,将html转化为纯文本,并将需要换行的标签替换为换行\n:

<!-- lang: java -->
public static void main(String... args) throws IOException {
    Validate.isTrue(args.length == 1, "usage: supply url to fetch");
    String url = args[0];

    // fetch the specified URL and parse to a HTML DOM
    Document doc = Jsoup.connect(url).get();

    HtmlToPlainText formatter = new HtmlToPlainText();
    String plainText = formatter.getPlainText(doc);
    System.out.println(plainText);
}

public String getPlainText(Element element) {
    //自定义一个NodeVisitor - FormattingVisitor
    FormattingVisitor formatter = new FormattingVisitor();
    //使用NodeTraversor来装载FormattingVisitor
    NodeTraversor traversor = new NodeTraversor(formatter);
    //进行遍历
    traversor.traverse(element);
    return formatter.toString();
}

下一节将从DOM结构开始对Jsoup代码进行分析。

© 著作权归作者所有

共有 人打赏支持
黄亿华

黄亿华

粉丝 2372
博文 131
码字总数 116344
作品 7
程序员
私信 提问
加载中

评论(1)

shizongger
shizongger
已经收藏,官方文档偏向字典查询类型的,你的博客是偏向实战类型的。感觉不错就收藏了。
Jsoup代码解读之六-parser(下)

最近生活上有点忙,女儿老是半夜不睡,精神状态也不是很好。工作上的事情也谈不上顺心,有很多想法但是没有几个被认可,有些事情也不是说代码写得好就行的。算了,还是端正态度,毕竟资历尚浅...

黄亿华
2013/08/30
0
2
Jsoup代码解读之三-Document的输出

Jsoup官方说明里,一个重要的功能就是output tidy HTML。这里我们看看Jsoup是如何输出HTML的。 HTML相关知识 分析代码前,我们不妨先想想,"tidy HTML"到底包括哪些东西: 换行,块级标签习惯...

黄亿华
2013/08/26
0
2
Jsoup代码解读之五-parser(中)

上一篇文章讲到了状态机和词法分析的基本知识,这一节我们来分析Jsoup是如何进行词法分析的。 代码结构 先介绍以下parser包里的主要类: Jsoup parser的入口facade,封装了常用的parse静态方...

黄亿华
2013/08/28
0
0
Jsoup代码解读之七-实现一个CSS Selector

![street fighter][1] 当当当!终于来到了Jsoup的特色:CSS Selector部分。selector也是我写的爬虫框架webmagic开发的一个重点。附上一张street fighter的图,希望以后webmagic也能挑战Jsoup...

黄亿华
2013/08/30
0
0
Jsoup代码解读之四-parser(上)

作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性。这部分也是Jsoup最复杂的部分,需要一些数据结构、状态机乃至编译器的知识。好在HTML语法不复杂,解析只是到DOM树为止,所...

黄亿华
2013/08/28
0
6

没有更多内容

加载失败,请刷新页面

加载更多

mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
1
0
大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时,Debian团队还发布了Debian ...

linux-tao
昨天
3
0
PHP 相关配置

1. php-fpm的pool 编辑php-fpm配置文件php-fpm.con vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容 include = etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vho......

Yue_Chen
昨天
2
0
EOS主网数据同步指南

本文介绍如何安装EOS节点软件并接入EOS主网,主要包括以下内容: 如何安装EOS节点软件 如何配置EOS节点软件接入主网 如何启动EOS节点软件与主网数据同步 如何检查主网数据同步进度 如何正确地...

汇智网教程
昨天
3
0
matlab-线性代数 齐次方程组 基础解系和通解

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% x1+2*......

志成就
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部