3使用Jsoup解析Java中HTML文件的示例

HTML是Web的核心,无论您是通过JavaScript,JSP,PHP,ASP还是任何其他Web技术动态生成的,您在Internet上看到的所有页面都是基于HTML的。 您的浏览器实际上是解析HTML并为您呈现。 但是,如果需要解析HTML文档并查找某些元素,标签,属性或检查特定元素是否存在,该怎么办,所有这些操作都使用Java程序完成。

如果您从事Java编程已经有几年了,我相信您已经使用DOM和SAX之类的解析器完成了一些XML解析工作。 具有讽刺意味的是,很少有需要从核心Java应用程序解析HTML文档的情况,该应用程序不包括Servlet和其他Java Web技术。 更糟的是,核心JDK中也没有HTTP或HTML库。 这就是为什么在解析HTML文件时 ,许多Java程序员不得不看Google以了解如何获取Java中HTML标记的价值。

当我需要时,我确定会有一个开源库为我实现该功能,但不知道它像JSoup一样出色且功能丰富。 它不仅提供了读取和解析HTML文档的支持,而且还允许您从HTML文件,其属性, JQuery样式的CSS类中提取任何元素,同时还允许您对其进行修改。 您可以使用Jsoup对HTML文档进行任何操作。

在本文中,我们将解析和HTML文件,并找出title和heading标签的值。 我们还将看到通过使用Java解析Google主页来从文件以及任何URL或Internet下载和解析HTML的示例。

Jsoup是用于处理实际HTML的开源Java库。 它提供了使用DOM,CSS和类似jquery的最好方法提取和处理数据的非常方便的API。 Jsoup实现WHATWG HTML5规范,并将HTML解析为与现代浏览器(例如Chrome和Firefox)相同的DOM。 这是jsoup库的一些有用的功能:

  • Jsoup可以从URL,文件或字符串中抓取并解析HTML
  • Jsoup可以使用DOM遍历或CSS选择器来查找和提取数据
  • Jsoup允许您操纵HTML元素,属性和文本
  • Jsoup针对安全的白名单提供干净的用户提交的内容,以防止XSS攻击
  • Jsoup还可以输出整洁HTML

Jsoup旨在处理现实世界中发现的各种HTML,其中包括经过正确验证HTML以完成不完整的非验证标签集合。 Jsoup的核心优势之一是它非常强大。

在此Java HTML解析教程中,我们将看到使用jsoup在Java中解析和遍历HTML文档的三个不同示例。 在第一个示例中,我们将解析一个HTML String ,其内容均为标记,以Java中的String文字形式出现。 在第二个示例中,我们将从网络上下载HTML文档,在第三个示例中,我们将加载我们自己的示例HTML文件login.html进行解析。 此文件是一个示例HTML文档,在正文部分包含一个标题标签和一个div,其中div包含一个HTML表单。 它具有输入标签来捕获用户名和密码,并提供提交和重置按钮以采取进一步措施。 这是可以验证的正确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()方法来从String,文件,基本URI,URL和InputStream中读取HTML文件。 如果它们不是“ UTF-8”格式,也可以指定字符编码以正确读取HTML文件。

parse(String html)方法将输入HTML解析为新的Document。 在Jsoup中,文档扩展了元素,该元素扩展了Node。 同样,TextNode扩展了Node。 只要您传递非null字符串 ,就可以确保您使用包含(至少)head和body元素的Document进行了成功,明智的解析。 拥有文档后,可以通过在Document及其父类Element和Node中调用适当的方法来获取所需的数据。

JSoupl HTML解析示例 这是我们完整的Java程序,用于解析HTML字符串,从Internet下载HTML文件和来自本地文件系统HTML文件。 为了运行该程序,您可以使用Eclipse IDE,也可以仅使用任何IDE或命令提示符 。 在Eclipse中,这非常简单,只需复制此代码,创建一个新的Java项目,右键单击src包并将其粘贴。 Eclipse将负责创建具有相同名称的正确的程序包和Java源文件,因此绝对省事。 如果您已经有一个Sample Java项目,那么这只是一步。 以下Java程序显示了3个解析和遍历HTML文件的示例。 在第一个示例中,我们直接解析具有html内容的String ,在第二个示例中,我们解析从URL下载HTML文件,在第三个示例中,我们从本地文件系统加载并解析HTML文档。

import java.io.File;
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 libraryString 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 URLDocument 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"); // wrongDocument htmlFile = null;try {htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} // righttitle = htmlFile.title();Element div = htmlFile.getElementById("login");String cssClass = div.className(); // getting class form HTML elementSystem.out.println("Jsoup can also parse HTML file directly");System.out.println("title : " + title);System.out.println("class of div tag : " + cssClass);}}
Output:
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 HTML解析器将尽一切努力从您提供HTML创建干净的解析,而不管HTML的格式是否正确。 它可以处理以下错误:
未关闭的标签(例如<p> Java <p> Scala到<p> Java </ p> <p> Scala </ p>)
隐式标签(例如ega裸<td> Java很棒</ td>包裹在<table> <tr> <td>中) 可靠地创建文档结构(html包含头和主体,并且头中仅包含适当的元素)。

Jsoup是一个出色且强大的开源库,它使读取html文档,正文片段,html字符串以及直接从Web上直接解析html内容变得非常容易。

翻译自: https://www.javacodegeeks.com/2014/09/3-examples-of-parsing-html-file-in-java-using-jsoup.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转载:闲话权限设计三层境界

转自&#xff1a;http://www.cnblogs.com/tsoukw/archive/2010/09/27/1836485.html喜欢金庸的武侠&#xff0c;对他那几部小说也是乐此不疲拿独孤求败来说&#xff0c;他的剑&#xff0c;从无名利剑&#xff0c;玄铁重剑&#xff0c;到木剑乃至最后的无剑&#xff0c;不知道破世…

webpack联邦模块之remotes方法

使用联邦模块后当前项目就会有两个依赖&#xff0c;一个是依赖共享模块&#xff0c;一个是依赖远程模块。运行时webpack/runtime/consumes用于解析共享模块&#xff0c;运行时webpack/runtime/remotes 用于解析远程模块。这两个模块对应的方法分别是__webpack_require__.f.cons…

径向菜单的制作

最终效果&#xff1a; 在径向菜单的制作前&#xff0c;首先需要知道几点知识点&#xff1a; Math.sin(x) x 的正玄值。返回值在 -1.0 到 1.0 之间&#xff1b; Math.cos(x) x 的余弦值。返回的是 -1.0 到 1.0 之间的数&#xff1b; 这两个函数中的X 都是指的“弧度”…

吉首大学2019年程序设计竞赛-F 天花乱坠

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/992/F 题意&#xff1a;给定正n边形&#xff0c;边长为100&#xff0c;以每条边的中点连线构成新的正n边形&#xff0c;无限循环下去&#xff0c;求所有边的长度和。 思路&#xff1a;简单数学计算题&#xff0c;可以…

SqliteHelper整理

刚开通博客不久&#xff0c;还没有发过文。这是第一篇&#xff0c;要鼓励我自己再接再厉。 另外&#xff0c;我也是刚刚踏上程序员这条路&#xff0c;有赖各位多多提携&#xff01; 闲话不多说&#xff0c;最近参与的项目包含本地化存储这一块。昨天就园子里找了些资料有另外补…

webpack联邦模块之consumes方法

对于使用联邦模块的项目会有两个依赖&#xff0c;一个是远程模块&#xff0c;一个是共享模块。上一篇文章解释了远程模块的加载和安装并初始化共享作用域。consumes则是共享模块的解决方案&#xff0c;用于在运行时加载并安装依赖的共享模块。 为什么叫consumes&#xff1f;我…

vue-cli使用说明

一、安装npm install -g vue-cli 推荐使用国内镜像 先设置cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 如果安装失败&#xff0c;可以使用 npm cache clean 清理缓存&#xff0c;然后再重新安装 然后使用 cnpm 安装 vue-cli 和 webpack cnpm inst…

OptaPlanner –具有真实道路距离的车辆路线

在现实世界中&#xff0c;车辆路径问题&#xff08;VRP&#xff09;中的车辆必须走这条路&#xff1a;它们不能在客户之间直线行驶。 大多数VRP研究论文和演示都乐于忽略此实现细节。 和我一样&#xff0c;过去。 尽管使用道路距离&#xff08;而不是空中距离&#xff09;不会对…

自旋锁

什么是自旋锁&#xff1f; 自旋锁&#xff08;spinlock&#xff09;&#xff1a;是指当一个线程在获取锁的时候&#xff0c;如果锁已经被其它线程获取&#xff0c;那么该线程将循环等待&#xff0c;然后不断的判断锁是否能够被成功获取&#xff0c;直到获取到锁才会退出循环。 …

关于如何在PSA众多请求号中查找数据是属于哪一条。

其中有两个TCODE: RSTSODS与RSTSODS&#xff0c;我们可以查找数据源的PSA表&#xff0c;然后在SE16中可以看到。 另外我们对PSA点击管理&#xff0c;一般会出现在窗口上面出现PSA的表名。 当然有些不在的话&#xff0c;那就去查找那两个TCODE。转载于:https://www.cnblogs.com/…

TCP握手为什么需要三次通信

TCP三步握手three way (or three message) handshake 是TCP核心知识点&#xff0c;很长一段时间内我无法理解为什么TCP建立连接需要三次通信&#xff0c;而不是两次或者四次或者更多次。我翻了很多问答和博客&#xff0c;他们说的都很有道理&#xff0c;但是借来的火&#xff0…

小程序用户拒绝授权解决方法

众所周知&#xff0c;小程序进入首先都要进行微信授权的&#xff0c;那万一用户不小心点了拒绝按钮怎么办呢&#xff1f;不要慌&#xff0c;官方早已预料到此情况&#xff0c;并提供了api供开发者使用&#xff0c;下面就一起来研究下api吧 一、API接口 wx.openSetting(OBJECT)…

揭示垃圾收集暂停的时间长度

有几种方法可以改善您的产品。 一种方法是仔细跟踪用户的体验并在此基础上进行改进。 我们确实自己应用了此技术&#xff0c;并再次花了一些时间查看不同的数据 除了我们追求的许多其他方面之外&#xff0c;我们还提出了一个问题“延迟GC触发应用程序的最坏情况是什么”。 为了…

异步导致UI句柄增加的解决办法

在很多操作中&#xff0c;都会使用到异步线程&#xff0c;具体怎样使用在这不说了&#xff0c;网上有很好的说明&#xff1b;本人通过Delegate.BeginInvoke实现异步调用&#xff0c;完成后对UI控件进行设值等&#xff0c;还有System.Timers.Timer都一样&#xff0c;使用的是线程…

[转]android ListView详解

本文转自&#xff1a;http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 由于google doc 很多人都打不开&#xff0c;故更新了源码下载地址 【源码下载】----2011-01-18 在android开发中ListView是比较常用的组件&#xff0c;它以列表的形式展示具体内容&#xff…

JS对象操作

一、String常用操作 1.截取 substr(start,length) //返回从指定位置开始的指定长度的字符串。 substring(start,end) //返回两个指定的位置之间的字符串。 slice(start,end) //包括字符串 stringObject 从 start 开始&#xff08;包括 start&#xff09;到 end 结束&#xff0…

JBoss BPM Suite 6.0.3版本的5个实用技巧

上周&#xff0c;红帽发布了标记为6.0.3的JBoss BPM Suite的下一版本&#xff0c;已订阅的用户可以在其客户门户中使用。 如果您对该版本的新增功能感到好奇&#xff0c;请在客户门户网站上在线查看版本说明和其余文档 。 我们正在寻找一些简单的方法来开始使用此新版本&…

package-lock.json

package.json确定依赖的范围&#xff0c;package-lock.json将这个范围精确到具体版本。主要是为了解决在各个环境中得到确定的node_modules&#xff0c;如果只依赖package.json因为该文件声明的是直接依赖的范围&#xff0c;它无法将直接依赖固定在某个特定版本&#xff0c;也无…

Linux启动管理

启动管理系统运行级别 运行级别&#xff1a;含义0 &#xff1a;关机1 &#xff1a;但用户模式&#xff0c;可以想象为windows的安全模式&#xff0c;主要用于系统修复2 &#xff1a;不完全的命令行模式&#xff0c;不含NFS服务3 &#xff1a;完全的命令行模式&#xff0c;就是标…

VB网站收集

1.vb源码 http://hi.baidu.com/aboutvb/home转载于:https://www.cnblogs.com/sode/archive/2011/11/05/2236883.html