Java中使用开源库JSoup解析HTML文件实例
html是web的核心,互联网中你看到的所有页面都是html,不管它们是由javascript,jsp,php,asp或者是别的什么web技术动态生成的。你的浏览器会去解析html并替你去渲染它们。不过如果你需要自己在java程序中解析html文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用java编程多年了,我相信你肯定试过去解析xml,也使用过类似dom或者sax这样的解析器,不过很有可能你从未进行过任何的html解析的工作。更讽刺的是,在java应用中,很少会有需要你去解析html文档的时候,这里并不包括servlet或者其它的java web技术。更糟糕的是,jdk核心里也没有包括http或者html的库,至少我并不知道有这个。这就是为什么一碰上解析html文件时,许多java程序员就得先google一下 ,看看如何在java中取出一个html的标签。当我有这个需要的时候,我相信肯定会有一些开源库能实现这个,不过我没有想到竟然有jsoup这么酷的并且功能齐全的库。它不仅能支持读取并解析html文档,而且还能让你从html文件抽取出任何的元素,以及它们的属性,它们的css属性,你还能进它们进行修改。有了jsoup你简直可以对html文档做任何事情。我们将会看到如何在java中从google主页或者任何url中下载并解析html文件的示例。
jsoup库是什么
jsoup是一个开源的java库,它可以用于处理实际应用中的html。它提供了非常便利的api来进行数据的提取及修改,充分利用了dom,css以及jquery风格方法的长处。jsoup实现了wahtwg html5的规范,它从html解析出来的dom和chrome以及firefox这样的现代浏览器解析出来的完全一致。下面是jsoup库的一些有用的特性:
1.jsoup可以从url,文件,或者字符串中获取并解析html。
2.jsoup可以查找并提取数据,可以使用dom遍历或者css选择器。
3.你可以使用jsoup来修改html元素,属性以及文本。
4.jsoup通过一个安全的白名单确保了用户提交的内容是干净的,以防止xss攻击。
5.jsoup还能输出整洁的html。
jsoup的设计初衷是用于处理现实生活中出现的各种不同的html,包括正确有效的html以及不完整的无效的标签集合。jsoup的一个核心竞争力就是它的健壮性。
在java中使用jsoup进行html解析
在这篇java html解析的教程中,我们会看到在java中使用jsoup解析及遍历html的三个不同的示例。第一个例子中,我们会解析一个html字符串,它的内容就是java中的字符串字面量组成的标签。第二个例子中,我们会从web中下载html文档,而第三个例子中,我们会加载一个html示例文件login.html来进行解析。这个文件是一个html文档的示例,它包含title标签,body里面有一个div标签,里面包含一个表单。它拥有input标签来用于获取用户名及密码,同时还有提交及重置的按钮用来进行下一步操作。它是一个正确有效的html,也就是说,所有的标签和属性都是正确地闭合的。下面是我们这个html的示例文件:
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>login page</title>
</head>
<body>
<div id="login" class="simple" >
<form action="login.do">
username : <input id="username" type="text" /><br>
password : <input id="password" type="password" /><br>
<input id="submit" type="submit" />
<input id="reset" type="reset" />
</form>
</div>
</body>
</html>
使用jsoup来解析html非常简单,你只需调用它的静态方法jsoup.parse()并传入你的html字符串给它就可以了。jsoup提供了多个重载的parse()方法,它可以从字符串,文件,uri,url,甚至inputstream中读取html文件。如果不是utf-8编码的话,你还可以指定字符编码,这样可以正确地读取html文件。下面是jsoup库中html解析方法的一个完整的列表。parse(string html)方法将输入的html解析成一个新的document。在jsoup里,document继承了element,而它又继承自node。同样的textnode也继承自node。只要你传入的是一个不为null的字符串,你就肯定能获取到一个成功的有意义的解析,得到一个包含head和body元素的document。一旦你拿到这个document,你就可以调用document以及它的父类element和node上面的适当的方法来获取到你想要的数据了。
解析html文档的java程序
下面是一个解析html字符串,网络上下载的html文件,以及本地文件系统中的html文件的完整的java程序。你可以使用eclipse ide或者别的ide甚至命令来运行这个程序。在eclipse里面则很简单,拷贝这份代码,新建一个java工程,在src包上右键并粘贴进去就可以了。eclipse会去创建正确的包及同名的java源文件的,因此工作量最小。如果你已经有一个java示例工程了,那么仅需一步就可以了。下面的这个java程序展示了解析及遍历html文件的三个不同例子。第一个例子中,我们直接解析了一个内容为html的字符串,第二个例子中我们解析了一个从url中下载的html文件,第三个中我们从本地文件系统中加载了一个html文档并进行解析。第一和第三个例子中都用到了parse方法来获取一个document对象,你可以查询它来提取出任何的标签值或者属性值。第二个例子中,我们用到了jsoup.connect方法,它会去创建url的连接,下载html并进行解析。这个方法也会返回document,它可以用于后续的查询及获取标签或者属性的值。
import java.io.ioexception;
import org.jsoup.jsoup;
import org.jsoup.nodes.document;
import org.jsoup.nodes.element;
/**
[*] java program to parse/read html documents from file using jsoup library.
[*] jsoup is an open source library which allows java developer to parse html
[*] files and extract elements, manipulate data, change style using dom, css and
[*] jquery like method.
[*]
[*] @author javin paul
[*]/
public class htmlparser{
public static void main(string args[]) {
// parse html string using jsoup library
string htmlstring = "<!doctype html>"
+ "<html>"
+ "<head>"
+ "<title>jsoup example</title>"
+ "</head>"
+ "<body>"
+ "|[b]helloworld[/b]"
+ ""
+ "</body>"
+ "</html>";
document html = jsoup.parse(htmlstring);
string title = html.title();
string h1 = html.body().getelementsbytag("h1").text();
system.out.println("input html string to jsoup :" + htmlstring);
system.out.println("after parsing, title : " + title);
system.out.println("afte parsing, heading : " + h1);
// jsoup example 2 - reading html page from url
document doc;
try {
doc = jsoup.connect("http://google.com/").get();
title = doc.title();
} catch (ioexception e) {
e.printstacktrace();
}
system.out.println("jsoup can read html page from url, title : " + title);
// jsoup example 3 - parsing an html file in java
//document htmlfile = jsoup.parse("login.html", "iso-8859-1"); // wrong
document htmlfile = null;
try {
htmlfile = jsoup.parse(new file("login.html"), "iso-8859-1");
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
} // right
title = htmlfile.title();
element div = htmlfile.getelementbyid("login");
string cssclass = div.classname(); // getting class form html element
system.out.println("jsoup can also parse html file directly");
system.out.println("title : " + title);
system.out.println("class of div tag : " + cssclass);
}
}
输出:
input html string to jsoup :<!doctype html><html><head><title>jsoup example</title></head><body><table><tr><td><h1>helloworld</h1></tr></table></body></html>
after parsing, title : jsoup example
afte parsing, heading : helloworld
jsoup can read html page from url, title : google
jsoup can also parse html file directly title : login page
class of div tag : simple
jsoup的好处就是它的健壮性很强。jsoup html解析器会对你提供的html进行尽量干净的解析,而不去考虑这个html是否是格式良好的。它可以处理如下这些错误:未闭合的标签(比如,java <p>scala to <p>javascala),隐式标签(比如,一个裸的|java is great被封装到了|里面),它总能创建出一个文档结构(包含head及body的html,并且head里只会包含正确的元素)。这就是在java中如何进行html的解析。jsoup是一个优秀的健壮的开源库,它使得读取html文档,body片段,html字符串,以及直接从web中解析html内容都变得相当简单。在这篇文章中,我们学习了如何在java中获取一个特定的html标签,正如第一个例子中我们将title及h1标签的值提取成了文本,而第三个例子中我们学习到了如何通过提取css属性来从html标签中获取属性值。除了强大的jquery风格的html.body().getelementsbytag("h1").text()方法,你还可以提取任意的html标签,它还提供了像document.title()和element.classname()这样便捷的方法,你可以快速获取到标题及css类。希望jsoup能让你玩得愉快,很快我们将会看到关于这个api的更多的一些例子。