使用Jsoup简单解析HTML文件示例

一、前言

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。在Java爬虫项目中,html解析也是必须的一环,这里简单介绍下jsoup的用法。

二、使用方法

1.获取Document对象。

如果html文件是以String形式保存的话,可以使用parse方法直接解析为Document:

Document doc = Jsoup.parse(html);

若是url形式的话可以使用connect方法直接获取html文件:

Document doc = Jsoup.connect("http://blog.csdn.net/roy_70").get();

如果运行的时候报了如下错误:

org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=...

这说明url的网站采用了策略禁止此类访问,需要模仿浏览器行为,可以使用如下方式:

doc = Jsoup.connect("http://blog.csdn.net/roy_70")
                    .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
                    .get();

或者

Document doc = Jsoup.connect("http://blog.csdn.net/roy_70")
                    .data("query", "Java")
                    .userAgent("Mozilla")
                    .cookie("auth", "token")
                    .timeout(3000)
                    .post();

2.解析Document

将HTML解析成一个Document之后,就可以使用类似于DOM的方法进行操作。Document内的方法非常多,具体使用可以参照API使用,常用的有:
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods)
getAllElements()
使用这些可以逐级解析出想要的Element项。
由于我对前端的只是不太了解,所以html和js的结构也不熟悉,只能根据上述基本的方法和字符串处理获取到想要的部分内容。

三、示例

以我的博客首页为例,http://blog.csdn.net/roy_70,获取到的html文件太大,就不全部贴出,以我们要取得访问数和积分为例,现根据id获取到这一部分。

Element times_content = doc.getElementById("blog_rank");

获取到的times_content内容如下:

<ul id="blog_rank"> 
         <li>访问:<span>59404次span>li> 
         <li>积分:<span>947span> li> 
         <li>等级: <span style="position:relative;display:inline-block;z-index:1"> <img src="http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/blog3.png" alt="" style="vertical-align: middle;" id="leveImg" /> 
           <div id="smallTittle" style=" position: absolute;  left: -24px;  top: 25px;  text-align: center;  width: 101px;  height: 32px;  background-color: #fff;  line-height: 32px;  border: 2px #DDDDDD solid;  box-shadow: 0px 2px 2px rgba (0,0,0,0.1);  display: none;   z-index: 999;"> 
            <div style="left: 42%;  top: -8px;  position: absolute;  width: 0;  height: 0;  border-left: 10px solid transparent;  border-right: 10px solid transparent;  border-bottom: 8px solid #EAEAEA;">div> 积分:947 
           div> span> li> 
         <li>排名:<span>千里之外span>li> 
        ul> 

我这里使用的getAllElement方法

Elements times_links = times_content.getElementsByTag("span");
System.out.println(times_links.get(0).toString());
System.out.println(String points = times_links.get(1).toString());

输出:

<li>访问:<span>59404次span>li> 
<li>积分:<span>947span> li> 

这样就得到了需要的两项元素。

四、后记

我相信jsoup提供了更为强大的处理,只因为我对html以及Document结构不太熟悉,所以无法灵活的使用其中强大的处理方法,这里只做了能做到的简单处理学习。以后如果有了更好的方法,会采用更简单的方法,也欢迎大家提供更为简单处理方式交流,谢谢。

你可能感兴趣的:(Java)