Jsoup代码解读之一-概述

转载自   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:

<!-- 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 DOMDocument doc = Jsoup.connect(url).get();HtmlToPlainText formatter = new HtmlToPlainText();String plainText = formatter.getPlainText(doc);System.out.println(plainText);
}public String getPlainText(Element element) {//自定义一个NodeVisitor - FormattingVisitorFormattingVisitor formatter = new FormattingVisitor();//使用NodeTraversor来装载FormattingVisitorNodeTraversor traversor = new NodeTraversor(formatter);//进行遍历traversor.traverse(element);return formatter.toString();
}

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法在计算机课程中的应用,尝试教学法在中职《计算机应用基础》课程中的应用(原稿)...

《尝试教学法在中职《计算机应用基础》课程中的应用(原稿).doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《尝试教学法在中职《计算机应用基础》课程中的应用(原稿)》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、尝试练习,安排学生进行…

Visual Studio“15”进一步改善性能和易用性

随着Visual Studio“15”开发工作的继续&#xff0c;微软也在不断介绍着为了改善该产品执行速度和安装后体积所做的诸多努力。第5个技术预览版近日已发布&#xff0c;在这些方面也有了进一步提高。 在微软公司John Montgomery发布的新闻稿中&#xff0c;他通过一个视频对比了Ro…

JAVA缓存的实现

转载自 JAVA缓存的实现 缓存可分为二大类: 一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上&#xff0c;不管你是以XML格式&#xff0c;序列化文件DAT格式还是其它文件格式&#xff1b; 二、内存缓存&#xff0c;也就是实现一个类中静态Map,对这个Map进行常规的增删…

myeclipse 2016 ci3破解教程(含软件下载)

一、myeclipse简介&#xff1a; MyEclipse企业级工作平台&#xff08;MyEclipseEnterprise Workbench &#xff0c;简称MyEclipse&#xff09;是对EclipseIDE的扩 展&#xff0c;利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效 率。…

系统架构师考试6

系统架构设计师考试经验 2018年01月29日 15:23:46 大宝大宝吃饱睡好 阅读数 346 原文链接 1. 考试准备流程 考试报名地址 网站比较奇葩&#xff0c;需要IE或者360&#xff0c;chrome不行 1.1 报名 网站注册【大概9月份】填写报名信息上传照片【需要注意照片大小&#xff0c;…

计算机主机组成实验,计算机组成原理实验-运算器组成实验报告

计算机组成原理实验-运算器组成实验报告 曾国江—计算机组成原理实验报告 - 0 - 计算机组成原理课程实验报告9.3 运算器组成实验姓 名&#xff1a; 曾国江 学 号&#xff1a; 系 别&#xff1a; 计算机工程学院 班 级&#xff1a; 网络工程1班 指导老师&#xff1a; 完成时间&a…

Jsoup解析HTML实例及文档方法详解

转载自 Jsoup解析HTML实例及文档方法详解这篇文章主要介绍了Jsoup如何解析一个HTML文档、从文件加载文档、从URL加载Document等方法&#xff0c;对Jsoup常用方法做了详细讲解&#xff0c;最近提供了一个示例供大家参考 使用DOM方法来遍历一个文档 从元素抽取属性&#xff0c;文…

系统架构师考试9

系统架构师复习经验及资料共享 [复制链接] 发表于 2018-2-5 11:25 | 来自 51CTO网页 [只看他] 楼主 在入职第一天。。 人力&#xff1a;有没有证书 我&#xff1a;。。没有&#xff0c;目前都有哪些证书 人力回了一张图&#xff0c;上面大概有PMP、项目管理师、系统架构师…

java通过commons-fileupload实现多张图片的上传(servlet)

//添加食品信息private void addProduct(HttpServletRequest request, HttpServletResponse response) throws IOException{PrintWriter out response.getWriter();/*Date datenew Date();SimpleDateFormat formatnew SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Stri…

javaweb项目搭建ehcache缓存系统

转载自 javaweb项目搭建ehcache缓存系统EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认的CacheProvider&#xff0c;同时在项目开发中也被广泛使用到。接下来就以用户缓存为例&#xff0c;基于javaweb项目来搭建ehcache…

微服务架构之外的选择——基于服务架构

来自ThoughtWorks的主管Neal Ford在最近的一次演讲中表达了他对企业软件系统架构转型的看法&#xff0c;他认为从单体架构转向基于服务的架构要比转向微服务架构来得容易。Ford在UberConf 2016大会上做了一次关于基于服务架构的演讲&#xff0c;基于服务架构是介于面向服务架构…

html5中 save方法,如何HTML5画布另存为窗口8 Metro应用中的图像文件?(How to save html5 c...

var myImage canvas.toDataURL("image/png");我认为myImage在现在png格式如何保存编码的图像字节myImage作为一个文件(图片文件夹)&#xff1f;Answer 1:而不是使用的.toDataUrl &#xff0c;你需要使用.msToBlob &#xff1a;var blob canvas.msToBlob();然后&…

系统架构师8

软考——系统架构设计师工作日志 《E:\Myproject\利亚德\x系统架构设计师\系统架构设计师工作日志.txt》 系统架构设计师 ok --》主要信息 官方&#xff1a; 人事考试服务频道.mht http://www.bjld.gov.cn/bjpta/ 北京人事考试 http://www.bjld.g…

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

Autofac 结合 Castle DynamicProxy2 功能 Autofac 不仅作为轻量级高效的 IoC 容器&#xff0c;而且还能很好的与 Castle.DynamicProxy2 结合起来&#xff0c;实现 AOP 功能。 首先&#xff0c;我们需要定义拦截器&#xff0c;简单的定义可实现 Castle.DynamicProxy.IIntercepto…

类和对象运行时在内存里是怎么样的?各种变量、方法在运行时是怎么交互的?

转载自 类和对象运行时在内存里是怎么样的&#xff1f;各种变量、方法在运行时是怎么交互的&#xff1f;在回答这个问题之前先了解一下Java的一些基础知识。我们知道Java程序运行在虚拟机环境里&#xff0c;那我们先看一下虚拟机的大致内存结构。如下图所示&#xff0c;虚线框…

java通过commons-fileupload实现多张图片的上传(jsp页面)

<div id"middle"><div id"form"><form action"ProductInfoServlet?tagadd" method"post" enctype"multipart/form-data" ><h2>三只松鼠--新增</h2><table align"center">&l…

系统架构师7

2017年11月11日 软件系统架构师考试经验分享 置顶 2017年11月13日 15:25:53 凌飞安 阅读数 7812 版权声明&#xff1a;原创作品&#xff0c;转载请注明出处&#xff01;个人主页 http://www.lingfeian.com https://blog.csdn.net/lingfeian/article/details/78520808 系统架构…

工业利用计算机实现生产自动化属于,自动化考试试题(含答案)

第一类&#xff1a;填空题一&#xff0e;填空题1&#xff0e;自动化控制系统按被控量的时间特性分为(连续量)和(离散量)。2&#xff0e;PLC 全称为(可编程序逻辑控制器)&#xff0c;DCS全称为( 集散控制系统)。3&#xff0e;输入输出单元是(PLC)与工业过程控制现场之间的连接部…

保定有国家承认的计算机学校吗,河北省122所大学名单,不在名单内的都是国家不承认的野鸡学校...

原标题&#xff1a;河北省122所大学名单&#xff0c;不在名单内的都是国家不承认的野鸡学校据教育部官网信息显示&#xff0c;截至2019年6月15日&#xff0c;河北省共有普通高等学校122所&#xff0c;其中本科院校61所&#xff0c;专科院校61所。在名单中虽然有一所211院校&…

从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

转载自 从Java类到对象的创建过程都做了些啥&#xff1f;内存中的对象是啥样的&#xff1f;先回顾一下Java程序执行的过程&#xff1a;Java程序执行时&#xff0c;第一步系统创建虚拟机进程&#xff0c;然后虚拟器用类加载器Class Loader加载java程序类文件到方法区。方法区放…