使用JSoup解析HTML文件

标签: jsoup 解析 html | 发表时间:2014-09-24 19:56 | 作者:
出处:http://it.deepinmind.com

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库的一些有用的特性:

  • Jsoup可以从URL,文件,或者字符串中获取并解析HTML。
  • Jsoup可以查找并提取数据,可以使用DOM遍历或者CSS选择器。
  • 你可以使用Jsoup来修改HTML元素,属性以及文本。
  • Jsoup通过一个安全的白名单确保了用户提交的内容是干净的,以防止XSS攻击。
  • 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>"
                + "<table><tr><td><h1>HelloWorld</h1></tr>"
                + "</table>"
                + "</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是否是格式良好的。它可以处理如下这些错误:未闭合的标签(比如,<p>Java <p>Scala to <p>Java</p> <p>Scala</p>),隐式标签(比如,一个裸的<td>Java is Great</td>被封装到了<table><tr><td>里面),它总能创建出一个文档结构(包含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的更多的一些例子。

原创文章转载请注明出处: 使用JSoup解析HTML文件

英文原文链接

相关 [jsoup 解析 html] 推荐:

使用JSoup解析HTML文件

- - Java译站
HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的. 你的浏览器会去解析HTML并替你去渲染它们. 不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢.

使用 jsoup 对 HTML 文档进行解析和操作

- - 互联网旁观者
Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是: 从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力. 但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup.

Jsoup-简单优雅的HTML dom解析工具

- - CSDN博客Web前端推荐文章
最近在做一个项目,需要在线从官网上下载选手的图片、名称信息,即做一个简易的网络爬虫,实时抓取最新官网选手数据. 在网上搜了很多开源工具,一开始试的是webharvest,搞了一个上午,终于被其奇怪的配置文件搞怕了,我就是想链接下载一个在线的HTML页面,然后解析其DOM元素,没有更好的工具吗. 终于,在google上找到了Jsoup,其官网( http://jsoup.org/)上的demo神奇的只有两句话.

[Android实例] 利用Jsoup解析Html实现的Android招聘信息大全

- - CSDN博客推荐文章
看到很多招聘网站都没有推出招聘信息客户端,想来利用现成的资源,解析他们网站上提供招聘信息,这里就利用了Jsoup来解析HTML中的数据,实现整理归纳,然后显示的一个程序,也算是一个学习的程序吧,这里,我们先看一下图片,以下就程序源码. 源码下载: 点击打开链接. 作者:kangkangz4 发表于2011-12-13 11:09:34 原文链接.

【网络爬虫之JSOUP使用简介】解析一个HTML字符串

- - CSDN博客编程语言推荐文章
来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它. jsonu能够帮你轻松解决这些问题. Jsoup.parse(String html) 方法或. Jsoup.parse(String html, String baseUri)示例代码:.

【网络爬虫之JSOUP使用简介】入门:解析和遍历一个HTML文档

- - CSDN博客互联网推荐文章
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容. 它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 从一个URL,文件或字符串中解析HTML;. 使用DOM或CSS选择器来查找、取出数据;. 可操作HTML元素、属性、 文本;.

【网络爬虫之JSOUP使用简介】解析一个body片断

- - CSDN博客编程语言推荐文章
假如你有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析. 这个HTML片断可以是用户提交的一条评论或在一个CMS页面中编辑body部分. Jsoup.parseBodyFragment(String html)方法.. parseBodyFragment 方法创建一个空壳的文档,并插入解析过的HTML到 body元素中.

jsoup select 选择器

- - 编程语言 - ITeye博客
采用CSS或类似jquery 选择器(selector)语法来处理HTML文档中的数据. 利用方法: Element.select(String selector)和 Elements.select(String selector). Jsoup的元素支持类似CSS或(jquery)的选择器语法的查找匹配的元素,可实现功能强大且鲁棒性好的查询.

JSOUP实现简单爬虫

- - ITeye博客
这个说是简单爬虫 其实连个爬虫也算不上吧 功能太精简了.... 流程很简单: 输入几个初始的网页 然后通过JSOUP获取网页中的a标签的href的值. 接着把新得到的地址放入任务队列中. 实现中的worker是一个单线程的派发器 用于产生Parser. Parser用于完成网页的保存 网页的解析 以及入队列操作.

浏览器是怎样工作的:渲染引擎,HTML解析(连载二)

- - 携程UED
渲染引擎的职责是……渲染,也就是把请求的内容显示到浏览器屏幕上. 默认情况下渲染引擎可以显示HTML,XML文档以及图片. 通过插件(浏览器扩展)它可以显示其它类型文档. 比如使用PDF viewer插件显示PDF文件. 我们会在一个专门的章节讨论插件与扩展. 在这一节我们将专注渲染引擎的主要用途——显示用CSS格式化的HTML与图片.