一、前言
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>947</span> </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>947</span> </li>
这样就得到了需要的两项元素。
四、后记
我相信jsoup提供了更为强大的处理,只因为我对html以及Document结构不太熟悉,所以无法灵活的使用其中强大的处理方法,这里只做了能做到的简单处理学习。以后如果有了更好的方法,会采用更简单的方法,也欢迎大家提供更为简单处理方式交流,谢谢。