Jsoup 解析Html网页

Jsoup是一款Java的HTML解析器,可方便地通过DOM、CSS选择器进行数据提取和操作。它可以解析HTML字符串、文件或URL,并提供了类似jQuery的API。本文介绍了Jsoup的主要功能,包括从不同源解析HTML,以及如何遍历和修改HTML文档内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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可以删除或添加任意元素。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值