Jsoup代码解读之一-概述
2016-05-06 20:46
513 查看
Jsoup代码解读之一-概述
今天看到一个用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:
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 API
org.w3c.dom类似,但并没有代码层面的关系。就是说你想用XML的一套API来操作Jsoup的结果是办不到的,但是正因为如此,才使得Jsoup可以抛弃xml里一些繁琐的API,使得代码更加简单。
还有一种方式是通过
NodeVisitor来遍历DOM树,这个在对整个html做分析和替换时比较有用:
public interface NodeVisitor { //遍历到节点开始时,调用此方法 public void head(Node node, int depth); //遍历到节点结束时(所有子节点都已遍历完),调用此方法 public void tail(Node node, int depth); }
HtmlToPlainText的例子说明了如何使用NodeVisitor来遍历DOM树,将html转化为纯文本,并将需要换行的标签替换为换行\n:
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(); }
[/code]
相关文章推荐
- Jsoup代码解读之二-DOM相关对象
- Jsoup代码解读之一-概述
- 原生JS投票特效
- JSON 数据格式
- JSP的三大指令和七大动作基本语法
- JavaScript清空数组的三种方法
- javascript的正则表达式判断中文
- JavaScript事件冒泡简介及应用
- js基础
- js阻止冒泡事件小案例
- 11、JavaScript生成随机数
- js模糊搜索关键字高亮显示,将字体变成红色
- Json 、 Jsonp
- Js中JSON.stringify()与JSON.parse()与eval()详解及使用案例
- DateTable与List<T>相互转换 及JSON与DataTable(DataSet)相互转化
- .net 通过Url获取站点json数据
- extjs监听获取焦点重新赋值
- JS获取客户端IP地址、MAC和主机名的7个方法汇总
- JavaScript之实现基本的增删改查功能
- 从零开始学_JavaScript_系列(17)——CSS<4>(定位、遮罩、float、弹性布局flex)