当前位置:  编程技术>java/j2ee

Java中使用开源库JSoup解析HTML文件实例

    来源: 互联网  发布时间:2014-11-08

    本文导语:  HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的。你的浏览器会去解析HTML并替你去渲染它们。不过如果你需要自己在Java程序中解析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的示例文件:

代码如下:

  
  
  
  
Login Page  
  
  
  
  
Username :
  
Password :
  
  
  
  
  
  
 

使用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 = "" 
                + "" 
                + "" 
                + "JSoup Example" 
                + "" 
                + "" 
                + "|[b]HelloWorld[/b]" 
                + "" 
                + "" 
                + ""; 
  
        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 :JSoup ExampleHelloWorld 
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

Scala to

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的更多的一些例子。


    
 
 

您可能感兴趣的文章:

  • 新手如何加入开源项目 有什么好的c++,java 开源适合新手 请指点!
  • Java开源报表工具 JasperReports
  • 开源 Java 模板引擎 Webit Script
  • Java开源网店系统 SHOP++
  • 轻量级java开源blog程序 npress
  • Java开源论坛 xlinecode
  • java开源内容管理系统 j4cms
  • 开源Java事务管理器 TransactionEssentials
  • Java的开源高性能memcached客户端 XMemcached
  • 听说,初学JAVA有两个开源程序是必看的,请问是哪两个。在那里下载?
  • 开源Java AJAX组件 ItsNat
  • Java 开源博客 B3log Solo
  • Java开源Web测试工具 WatiJ
  • Java开源OA系统 J.Office
  • 开源的Java EE架构 ape-j
  • 金刚Java开源网店系统 KgShop
  • 分享7款开源Java反编译工具
  • Java开源项目Hibernate
  • Java开源中文分词器 jcseg
  • java Servlet获取和设置cookie实例代码
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • 可以有其他两个类的实例同时调用一个java实例的两个方法吗?
  • <java技术手册>与<java实例技术手册>这两本书怎么样?
  • Java单例模式实例简述
  • 寻求java加密算法及实例
  • java web start实例代码COPY不了,怎么办?
  • 请问哪里有《java实例技术手册》的电子书下载?100分赠送!
  • 请教:JAVA中说什么类的实例,那是怎么样的一个概念呢?
  • java实现大数加法(BigDecimal)的实例代码
  • Java究竟能干些什么呢?清高手们列举一些实例出来,跟帖有分.
  • java HashMap的keyset实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java 公式解析 表达式解析 expression-analyzer
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。
  • java解析xml之jdom解析xml示例分享
  • Java 的解析器代码生成器 AustenX
  • Java的HTML解析器 Jerry
  • java解析xml之dom4j解析xml示例分享
  • java解析xml之dom解析xml示例分享
  • Java的CSV解析包 CSVBeans
  • Java的CSV解析包 CSVObjects
  • 求教JAVA中XML解析问题
  • Java表达式解析器 JExel
  • Java代码解析工具 JavaFE
  • Java表达式语法解析库 parboiled
  • Java的HTML解析包 jScraper
  • Java的 RSS/Atom的解析器 FeedParser
  • Java的HL7解析器 HAPI
  • java解析xml用什么包?
  • 有什么java包可以支持解析html的。
  • Java结构化数据解析包 Lycia
  • Java的HTML解析库 gohtml
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3