在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Jsoup代码解读之一-概述

2017-2-23 13:22| 发布者: zhangjf| 查看: 1069| 评论: 0

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

来自: http://www.importnew.com/17746.html

今天看到一个用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:

  1. public static void main(String[] args) throws IOException {
  2. Validate.isTrue(args.length == 1, "usage: supply url to fetch");
  3. String url = args[0];
  4. print("Fetching %s...", url);
  5. // 下载url并解析成html DOM结构
  6. Document doc = Jsoup.connect(url).get();
  7. // 使用select方法选择元素,参数是CSS Selector表达式
  8. Elements links = doc.select("a[href]");
  9. print("nLinks: (%d)", links.size());
  10. for (Element link : links) {
  11. //使用abs:前缀取绝对url地址
  12. print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35));
  13. }
  14. }
复制代码

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

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

  1. public interface NodeVisitor {
  2. //遍历到节点开始时,调用此方法
  3. public void head(Node node, int depth);
  4. //遍历到节点结束时(所有子节点都已遍历完),调用此方法
  5. public void tail(Node node, int depth);
  6. }
  7. HtmlToPlainText的例子说明了如何使用NodeVisitor来遍历DOM树,将html转化为纯文本,并将需要换行的标签替换为换行n:
  8. public static void main(String... args) throws IOException {
  9. Validate.isTrue(args.length == 1, "usage: supply url to fetch");
  10. String url = args[0];
  11. // fetch the specified URL and parse to a HTML DOM
  12. Document doc = Jsoup.connect(url).get();
  13. HtmlToPlainText formatter = new HtmlToPlainText();
  14. String plainText = formatter.getPlainText(doc);
  15. System.out.println(plainText);
  16. }
  17. public String getPlainText(Element element) {
  18. //自定义一个NodeVisitor - FormattingVisitor
  19. FormattingVisitor formatter = new FormattingVisitor();
  20. //使用NodeTraversor来装载FormattingVisitor
  21. NodeTraversor traversor = new NodeTraversor(formatter);
  22. //进行遍历
  23. traversor.traverse(element);
  24. return formatter.toString();
  25. }
复制代码

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

上一篇:java NIO下一篇:Java NIO:浅析I/O模型

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 09:24

Copyright 2015-2025 djqfx

返回顶部