您的位置:首页 > Web前端 > JavaScript

Jsoup 解析Html网页

2014-03-31 19:49 459 查看
一、Jsoup 简介
jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,可以看作是java版的jQuery。
jsoup的主要功能如下:
§ 从一个URL,文件或字符串中解析HTML;
§ 使用DOM或CSS选择器来查找、取出数据;
§ 可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。官方网站:http://jsoup.org/
二、解析遍历HTML文档
Jsoup处理HTML文件是,是将用户输入的HTML文档,解析转换成一个Document对象进行处理。Jsoup一般支持以下几种来源内容的转换。
§ 解析一个html字符串
§ 解析一个body片段
§ 根据一个url地址加载Document对象
§ 根据一个文件加载Document对象
(1)字符串解析
在处理一个html字符串。我们可能需要对其进行解析,并提取其内容,或校验其格式是否完整,或者想修改它,检查里面的div标签没有闭合。Jsoup可以帮助我们轻松的解决这些问题。比如:
String html = "<html><head><title>Firstparse</title></head>"
+"<body><p>Parse HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

(2)解析body片段

假如我们现在有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析。这个HTML片断可以是用户提交的一条评论或在一个CMS页面中编辑body部分。我们可以使用使用Jsoup.parseBodyFragment(String
html)方法。
String html = "<div><p align="center"><imgalt="" width="60" height="80"src="/erp/UserFiles/Image/51.jpg" />这是P元素的内容</p>";
Document document = Jsoup.parseBodyFragment(html);
看到这里可能会有疑问,这个和上面的html片段是一样的嘛。没错是一样的,parseBodyFragment 方法创建一个空壳的文档,并插入解析过的HTML到body元素中。假如使用正常的

Jsoup.parse(Stringhtml) 方法,通常也可以得到相同的结果,但是明确将用户输入作为 body片段处理,以确保用户所提供的任何糟糕的HTML都将被解析成body元素。

Document.body()方法能够取得文档body元素的所有子元素,与doc.getElementsByTag("body")相同。

(3)从URL解析
有时候我们可能希望通过一个url地址,然后提取里面的内容,转换成document对象。我们以前可能是使用http client等模拟一个请求,然后取得返回内容等,使用Jsoup方便简单的解决这个问题。示例如下:
Document document = Jsoup.connect("http://www.baidu.com").get();
String title =document.title();
String text =document.text();

connect(Stringurl) 方法创建一个新的Connection,

get() 取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出IOException,应适当处理。
Connection
接口还提供一个方法链来解决特殊请求,具体如下:
Document doc = Jsoup.connect("http://test.com").data("query","Java").userAgent("Mozilla").cookie("auth","token").timeout(3000).post();

可以向链接地址post参数,设置userAgent,cookie,timeout等,而且这里是采用的链接操作很方便(熟悉jQuery的应该很熟悉这样的链接操作)。

(4)从html解析

有时候我们要处理的html内容,可能是存在硬盘上的某个文件里面,我们需要从中提取或者解析某些内容出来,我们可以通过Jsoup来这样处理。示例代码如下:
File input = new File("d:/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://test.com/");

doc.select("div.commentsa").attr("rel", "nofollow");
// 为所有链接增加 rel=nofollow 属性
doc.select("div.commentsa").addClass("mylinkclass");
// 为所有链接增加 class=mylinkclass 属性
doc.select("img").removeAttr("onclick");// 删除所有图片的onclick 属性
doc.select("input[type=text]").val("");// 清空所有文本输入框中的文本看到这里可能有一个疑问,第一个参数是文件,第二是编码,第三个是什么呢?第三个参数是baseUrl,使用他我们可以方便的处理相对路径问题,如果不需要可以不传,这是一个多态方法,在前面的三个部分里面,都可以再加一个这样的baseUrl。

三、获取解析数据
Document doc = Jsoup.parse(input, "UTF-8", "http://test.com/");
Element content = doc.getElementById("content");//找出id为content的片段
Elements links = content.getElementsByTag("a");//找出id为content片段中a 标签
for(Element link : links) {//对获取的a标签进行循环
String linkHref = link.attr("href");
String linkText = link.text();
}
Elements links =doc.select("a[href]"); // 具有href 属性的链接
Elements pngs =doc.select("img[src$=.png]");// 所有引用 png 图片的元素
Element masthead =doc.select("div.masthead").first();
// 找出定义了 class=masthead 的元素
Elements resultLinks =doc.select("h3.r > a"); // direct a after h3
这是 jsoup 真正让我折服的地方,jsoup 使用跟 jQuery 一模一样的选择器对元素进行检索,以上的检索方法如果换成是其

他的 HTML 解释器,至少都需要很多行代码,而 jsoup 只需要一行代码即可完成。
查找元素:
§ getElementById(String id)

§ getElementsByTag(String
tag)
§ getElementsByClass(String
className)
§ getElementsByAttribute(Stringkey)
(and related methods)
§ Element siblings:
siblingElements(),firstElementSibling(),

lastElementSibling();nextElementSibling(),previousElementSibling()

§ Graph:
parent(),children(),child(int
index)
元素数据:
§ attr(String key)获取属性attr(Stringkey,
String value)设置属性
§ attributes()获取所有属性

§ id(),className()
and
classNames()
§ text()获取文本内容text(Stringvalue)
设置文本内容
§ html()获取元素内HTMLhtml(Stringvalue)设置元素内的HTML内容

§ outerHtml()获取元素外HTML内容
§ data()获取数据内容(例如:script和style标签)

§ tag()and

tagName()
操作HTML:
§ append(String html),

prepend(String html)
§ appendText(String text),

prependText(String text)
§ appendElement(String
tagName),
prependElement(String tagName)
§
html(Stringvalue)
四、修改数据

在解析html的同时,jsoup还可以对html进行修改。

doc.select("div.commentsa").attr("rel", "nofollow"); // 为所有链接增加 rel=nofollow 属性
doc.select("div.commentsa").addClass("mylinkclass"); // 为所有链接增加 class=mylinkclass 属性
doc.select("img").removeAttr("onclick");// 删除所有图片的onclick 属性
doc.select("input[type=text]").val("");// 清空所有文本输入框中的文本

利用jsoup可以删除或添加任意元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: