Jsoup解析HTML标签内容
⼀、 JSOUP简介
jsoup 是⼀款 Java 的HTML 解析器,可直接解析某个URL地址、HTML⽂本内容。它提供了⼀套⾮常省⼒的API,可通过DOM,CSS以及类似于的操作⽅法来取出和操作数据,可以看作是java版的jQuery。
jsoup的主要功能如下:
从⼀个URL,⽂件或字符串中解析HTML;
使⽤DOM或CSS选择器来查、取出数据;
可操作HTML元素、属性、⽂本;
⼆、解析遍历HTML⽂档
Jsoup处理HTML⽂件是,是将⽤户输⼊的HTML⽂档,解析转换成⼀个Document对象进⾏处理。Jsoup⼀般⽀持以下⼏种来源内容的转换。
解析⼀个html字符串
解析⼀个body⽚段
根据⼀个url地址加载Document对象
根据⼀个⽂件加载Document对象
(⼀)解析⼀个html字符串
在处理⼀个html字符串。我们可能需要对其进⾏解析,并提取其内容,或校验其格式是否完整,或者想修改它。Jsoup可以帮助我们轻松的解决这些问题。
在Jsoup中有⼀个这样的静态⽅法Jsoup.parse(String html),可以将我们的html⽚段转换成Document对象。⽰例如下:
1 2String html ="<div><p align=\"center\"><img alt=\"\" width=\"660\" height=\"852\" src=\"/erp/UserFiles/Image/51.jpg\" />这是P元素的内容</p>";
Document document = Jsoup.parse(html);
使⽤上⾯的⽅法,就可以将html字符串,转换成Document对象,⼀旦有了Document对象,我们就可
以使⽤其中适当的⽅法根据需求处理问题。我们可以看到这⾥转换的html⽚段并不是⼀个合法的html⽚段,⾥⾯的div标签没有闭合。这对于Jsoup来说不是问题,它可以很好的处理这类问题。
(⼆) 解析body⽚段
假如我们现在有⼀个HTML⽚断 (⽐如. ⼀个 div 包含⼀对 p 标签; ⼀个不完整的HTML⽂档) 想对它进⾏解析。这个HTML⽚断可以是⽤户提交的⼀条评论或在⼀个CMS页⾯中编辑body部分。我们可以使⽤使⽤⽅法。
⽰例如下:
1 2String html ="<div><p align=\"center\"><img alt=\"\" width=\"660\" height=\"852\" src=\"/erp/UserFiles/Image/51.jpg\" />这是P元素的内容</p>";
Document document = Jsoup.parseBodyFragment(html);
看到这⾥可能会有疑问,这个和上⾯的html⽚段是⼀样的嘛。没错是⼀样的,parseBodyFragment ⽅法创建⼀个空壳的⽂档,并插⼊解析过的HTML到body元素中。假如使⽤正常的⽅法,通常也可以得到相同的结果,但是明确将⽤户输⼊作为 body⽚段处理,以确保⽤户所提供的任何糟糕的HTML都将被解析成body元素。
⽅法能够取得⽂档body元素的所有⼦元素,与ElementsByTag("body")相同。
(三) 根据⼀个URL地址加载Document对象
有时候我们可能希望通过⼀个url地址,然后提取⾥⾯的内容,转换成document对象。我们以前可能是使⽤http client等模拟⼀个请求,然后取得返回内容等,使⽤Jsoup⽅便简单的解决这个问题。⽰例如下:
1 2 3String title = document.title(); String text = ();
⽅法创建⼀个新的 , 和取得和解析⼀个HTML⽂件。如果从该URL获取HTML时发⽣错误,便会抛出 IOException,应适当处理。
接⼝还提供⼀个⽅法链来解决特殊请求,具体如下:
1
可以向链接地址post参数,设置userAgent,cookie,timeout等,⽽且这⾥是采⽤的链接操作很⽅便(熟悉jQuery的应该很熟悉这样的链接操作)。
(四)根据⽂件加载document
有时候我们要处理的html内容,可能是存在硬盘上的某个⽂件⾥⾯,我们需要从中提取或者解析某些内容出来,我们可以通过Jsoup来这样处理。⽰例代码如下:
1
2
File input =new File("d:/input.html");
看到这⾥可能有⼀个疑问,第⼀个参数是⽂件,第⼆是编码,第三个是什么呢?第三个参数是baseUrl,使⽤他我们可以⽅便的处理相对路径问题,如果不需要可以不传,这是⼀个多态⽅法,在前⾯的三个部分⾥⾯,都可以再加⼀个这样的baseUrl,后⾯会详细讲述。
三、数据抽取
(⼀) 使⽤Dom⽅法遍历⽂档
通过第⼆章我们可以获取⼀个document的对象,我们可以通过这个对象来遍历⽂档,如:
1 2 3 4 5 6 7Element content = ElementById("content"); Elements links = ElementsByTag("a"); for(Element link : links) {
String linkHref = link.attr("href");
String linkText = ();
}
这⾥我们可以⽅便的使⽤Doument对象的⽅法来获取内容。常⽤⽅法如下:查元素
(and related methods)
Element siblings: , ,;,
Graph: , ,
元素数据
获取属性设置属性
获取所有属性jquery是什么选择器
, and
获取⽂本内容设置⽂本内容
获取元素内HTML设置元素内的HTML内容
获取元素外HTML内容
获取数据内容(例如:script和style标签)
and
操作HTML和⽂本
,
,
,
(⼆) 使⽤选择器来查元素
使⽤jQuery时,我们⽆不为其强⼤的选择器叹服,jsoup有同样的强⼤的选择器,可以⽅便我们的对⽂档进⾏处理。⽰例代码如下:
1 2 3 4 5 6Elements links = doc.select("a[href]");
//带有<span >href</span>属性的a元素
Elements pngs = doc.select("img[src$=.png]");
//扩展名为.<span >png</span>的图⽚
Element masthead = doc.select("div.masthead").first();
//class等于<span >masthead</span>的<span >div</span>标签Elements resultLinks = doc.select("h3.r > a");//在h3元素之后的a元素
jsoup elements对象⽀持类似于 (或)的选择器语法,来实现⾮常强⼤和灵活的查功能。.
这个select ⽅法在, ,或对象中都可以使⽤。且是上下⽂相关的,因此可实现指定元素的过滤,或者链式选择访问。Select⽅法将返回⼀个集合,并提供⼀组⽅法来抽取和处理结果。
(三) 从元素中抽取属性和⽂档
使⽤Jsoup抽取属性,⼀般⽅法如下:
要取得⼀个属性的值,可以使⽤⽅法
对于⼀个元素中的⽂本,可以使⽤⽅法
对于要取得元素或属性中的HTML内容,可以使⽤, 或⽅法
⽰例如下:
01
02 03 04 05 06 07 08 09 10 11Document doc = Jsoup.parse(html);//解析HTML字符串返回⼀个Document实现Element link = doc.select("a").first();//查第⼀个a元素</pre>
String text = doc.body().text();// "An example link"//取得字符串中的⽂本String linkText = ();// "example""//取得链接地址中的⽂本</pre>
String linkOuterH = link.outerHtml();
String linkInnerH = link.html();// "<b>example</b>"//取得链接内的html内容
(四) URL处理
我们在处理HTML内容时,可能经常会遇到这种问题,需要将html页⾯⾥⾯的链接地址从相对地址转换成绝对地址,jsoup有⼀个⽅法⽤来解决此问题。我们前⾯对到的baseurl,就是⽤来解决此问题的。⽰例代码如下:
1
2 3 4 5Element link = doc.select("a").first(); String relHref = link.attr("href");// == "/" String absHref = link.attr("abs:href");
在HTML元素中,URLs经常写成相对于⽂档位置的相对路径: <a href="/download">...</a>. 当你使⽤⽅法来取得a元素的href属性时,它将直接返回在HTML源码中指定定的值。
假如你需要取得⼀个绝对路径,需要在属性名前加 abs: 前缀。这样就可以返回包含根路径的URL地址attr("abs:href")
因此,在解析HTML⽂档时,定义base URI⾮常重要。如果你不想使⽤abs: 前缀,还有⼀个⽅法能够实现同样的功能
四、数据修改
(⼀) 设置属性值
在处理html时,我们有时候可能需要修改⾥⾯的属性值,如图⽚地址、class名称等各种属性。
可以使⽤属性设置⽅法 , 和 .
假如你需要修改⼀个元素的 class 属性,可以使⽤和⽅法。
提供了批量操作元素属性和class的⽅法,⽐如:要为div中的每⼀个a元素都添加⼀个rel="nofollow"
可以使⽤如下⽅法:
1doc.select("divments a").attr("rel","nofollow");
这⾥的jsoup⽅法同样⽀持链接操作,如下:
1doc.select("div.masthead").attr("title","jsoup").addClass("round-box");
(⼆) 设置元素的html内容
我们需要向html⾥⾯添加html⽚段等内容时可以如下操作:
1
2 3 4 5 6 7 8 9Element div = doc.select("div").first();// <div></div>
div.html("<p>lorem ipsum</p>");// <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");//在div前添加html内容
div.append("<p>Last</p>");//在div之后添加html内容
// 添完后的结果: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div> Element span = doc.select("span").first();// <span>One</span>
//对元素包裹⼀个外部HTML内容添完后的结果:
(三) 设置元素的⽂本内容
如果我们需要修改元素内的⽂本内容,可以如下操作:
1 2 3 4 5Element div = doc.select("div").first();// <div></div> ("five > four");// <div>five > four</div> div.prepend("First ");
div.append(" Last");
// now: <div>First five > four Last</div>
说明
⽂本设置⽅法与⽅法⼀样:
将清除⼀个元素中的内部HTML内容,然后提供的⽂本进⾏代替
和将分别在元素的内部html前后添加⽂本节点。
对于传⼊的⽂本如果含有像 <, > 等这样的字符,将以⽂本处理,⽽⾮HTML。
================================================
SELECTA TRID,INFONAME SUBSTR(C.TVALUE, 1, 100)SVALUE FROM ut_cat_mddata
1 导⼊<%@page import="org.jsoup.Jsoup"%>包
2 String hvalue="<p style='text-indent:2em;'>"+"环境保护作为惠民⽣促和谐的重要任务";
des.Document docs = Jsoup.parse(hvalue);//解析HTML字符串(不检查标签完整性)des.Document doc = Jsoup.parseBodyFragment(hvalue) ;//解析HTML字符串(检查标签完整性) String tvalue = docs.body().text(); //获取⽂本内容
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论