最近实习在用jsoup写的一个html解析器解析网站,提取内容。发现这个框架很好用,这里简单总结下,基于IBM社区的文档,原文:https://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/index.html#N1005A
Jsoup的好处在于直接解析某个URL,文本的信息,可以类似于DOM操作,直接提取某个标签,然后可以加一些限制条件,比如 is(), parent(),匹配某个attribute的值等等,可以根据节点名称或者是 HTML 元素的 id 来获取对应的元素或者元素列表。
类层次图:
jsoup可以直接对字符串,url,文本解析。
字符串:Document doc = Jsoup.parse(html);
URL: Document doc = Jsoup.connect("http://www.oschina.net/").get();
文本:File input = new File("D:/test.html"); Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");第三个名为 baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也就是这个 baseURL。
功能超强的选择器:Elements links = doc.select("a[href]"); // 选择具有href的属性
Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素
doc.select("div.comments a").attr("rel", "nofollow"); // 为所有链接增加 rel=nofollow 属性
doc.select("div.comments a").addClass("mylinkclass"); // 为所有链接增加 class="mylinkclass" 属性
doc.select("img").removeAttr("onclick"); // 删除所有图片的 onclick 属性
doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本
HTML 文档清理:jsoup 使用一个 Whitelist 类用来对 HTML 文档进行过滤脚本,提供几个常用方法:
node()//只允许包含文本信息
basic()://允许的标签包括:a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong等属性
simpleText()://只允许 b, em, i, strong, u 这些标签
jsoup的选择器:tagname()//使用命名空间的标签定位
ns|tag:使用命名空间的标签定位,例如 fb:name 来查找 <fb:name> 元素
#id:使用元素 id 定位,例如 #logo
.class:使用元素的 class 属性定位,例如 .head
jsoup还支持组合语法。