最近在做数据挖掘的过程中需要对html的源码进行解析,用到了Jsoup这个解析工具,下面写个基本实例来展现它的用法。
需要用到jar包:jsoup-1.7.2.jar,可以到jsoup的官网下载:http://jsoup.org/download
import java.io.File; import java.io.IOException; import java.sql.Timestamp; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; public class Main { public static void main(String[] args) throws IOException { //解析url String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1"; Document doc = (Document) Jsoup.connect(threadUrl).get(); System.out.println(doc); //解析html文档 //File input = new File("D:\\text.txt"); //Document doc = Jsoup.parse(input, "UTF-8"); for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){ if(!ele.select("td").toString().equals("")){ String url = ele.select("td").get(0).select("a").attr("href"); String text = ele.select("td").get(0).select("a").text(); String author = ele.select("td").get(1).select("a").text(); Integer click = Integer.valueOf(ele.select("td").get(2).text()); Integer reply = Integer.valueOf(ele.select("td").get(3).text()); Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00"); } } } }下面附上一部分要解析的源码内容:
<div class="mt5"> <table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-bbs-list tab-bbs-list-2"> <colgroup> <col class="col-title" /> <col class="" /> <col class="" /> <col class="" /> <col class="col-date" /> </colgroup> <tbody> <tr> <th scope="col"> 标题</th> <th scope="col">作者</th> <th scope="col">点击</th> <th scope="col">回复</th> <th scope="col">发表时间</th> </tr> </tbody> <tbody> <tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td> <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td> <td>4</td> <td>1</td> <td title="2013-05-14 17:02">05-14 17:02</td> </tr> <tr> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-484257-1.shtml" title="" target="_blank">五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点</a></td> <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td> <td>13</td> <td>0</td> <td title="2013-04-26 17:20">04-26 17:20</td> </tr> <tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-483507-1.shtml" title="" target="_blank">无锡樱花温泉,梦回江南之境</a></td> <td><a href="http://www.tianya.cn/n/hauhuacaocao" target="_blank" class="author">hauhuacaocao</a></td> <td>36</td> <td>0</td> <td title="2013-04-24 16:14">04-24 16:14</td> </tr> <tr> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-482981-1.shtml" title="" target="_blank">灵山大佛【无锡灵山大佛旅游攻略】灵山大佛游记</a></td> <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td> <td>38</td> <td>1</td> <td title="2013-04-22 19:03">04-22 19:03</td> </tr> <tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-482796-1.shtml" title="" target="_blank">记江苏无锡的第一次骑行</a></td> <td><a href="http://www.tianya.cn/n/我的儿子叫孙好帅" target="_blank" class="author">我的儿子叫孙好帅</a></td> <td>73</td> <td>1</td> <td title="2013-04-22 09:31">04-22 09:31</td> </tr> <tr> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-481470-1.shtml" title="" target="_blank">4月25日从重庆到南京-扬州-镇江-无锡-苏州-上海,自助,急求驴...</a></td> <td><a href="http://www.tianya.cn/n/伊叶飘" target="_blank" class="author">伊叶飘</a></td> <td>33</td> <td>0</td> <td title="2013-04-16 13:07">04-16 13:07</td> </tr> <tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-478290-1.shtml" title="" target="_blank">无锡自由行</a></td> <td><a href="http://www.tianya.cn/n/龙在鑫" target="_blank" class="author">龙在鑫</a></td> <td>443</td> <td>10</td> <td title="2013-03-30 23:14">03-30 23:14</td> </tr> <tr> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-475732-1.shtml" title="" target="_blank">无锡朋友-登山啦</a></td> <td><a href="http://www.tianya.cn/n/championjun" target="_blank" class="author">championjun</a></td> <td>16</td> <td>0</td> <td title="2013-03-18 16:48">03-18 16:48</td> </tr>下面分析上面的代码:
Jsoup可以通过打开指定url的方式或者直接打开html文档的方式,对源码进行解析。
打开url方式:
String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1"; Document doc = (Document) Jsoup.connect(threadUrl).get();打开html文档:
File input = new File("D:\\text.txt"); Document doc = Jsoup.parse(input, "UTF-8");我使用的是打开url: http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1
这是天涯论坛的某一个版块的内容,我要做的就是要提取里面的有用信息。
for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){ if(!ele.select("td").toString().equals("")){ String url = ele.select("td").get(0).select("a").attr("href"); String text = ele.select("td").get(0).select("a").text(); String author = ele.select("td").get(1).select("a").text(); Integer click = Integer.valueOf(ele.select("td").get(2).text()); Integer reply = Integer.valueOf(ele.select("td").get(3).text()); Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00"); } }这个for循环做的是对有用信息的提取。首先,通过getElementsByClass("tab-bbs-list"),找到的是
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-bbs-list tab-bbs-list-2"> .......</tbody></table>这个表格内存储着我们需要的全部信息,我们首先定位到这个表格的标签,通过class的名称tab-bbs-list找到它,后面的get(0),指定了是第一个class="tab-bbs-list tab-bbs-list-2">,如果源码中还有第二个这样的table,我们要指定使用第二个table,则就要用get(1)。
select("tbody > tr")指的是查找tbody下所有tr标签(此处多谢yenshen指正),现在就将范围缩小到了所有tbody的tr标签了,即:
<tr> <th scope="col"> 标题</th> <th scope="col">作者</th> <th scope="col">点击</th> <th scope="col">回复</th> <th scope="col">发表时间</th> </tr> <tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td> <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td> <td>4</td> <td>1</td> <td title="2013-05-14 17:02">05-14 17:02</td> </tr> <tr> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-484257-1.shtml" title="" target="_blank">五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点</a></td> <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td> <td>13</td> <td>0</td> <td title="2013-04-26 17:20">04-26 17:20</td> </tr> ....我们就是在一步步的缩小范围。现在已经定位到<tr>.....</tr>范围。
!ele.select("td").toString().equals("")表示说如果没有td这种标签,像第一个<tr>...<tr>,它内部就没有<td>标签,所以我们要过滤掉,因为我们需要提取的信息在<td>标签内。
如果存在<td>标签,现在ele已经定位到了<tr>,以第二个<tr>为例:
<tr class="bg"> <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td> <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td> <td>4</td> <td>1</td> <td title="2013-05-14 17:02">05-14 17:02</td> </tr>
ele.select("td").get(0).select("a").attr("href");ele.select("td")是检索出所有的<td>,后边的get(0),指定了是定位到第一个<td>,即:
<td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td>然后select("a")是定位到这个<td>内部的<a>标签:
<a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a>.attr("href"):这个方法是获取属性名称为href的属性,即:"/post-travel-489511-1.shtml"
这样,我们就提取到了url。
text():方法是获取标签的内容
String text = ele.select("td").get(0).select("a").text();我们定位到了<a>...</a>,text()就是取得<a>...</a>之间的内容。
附:
Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下: 查找元素 getElementById(String id) getElementsByTag(String tag) getElementsByClass(String className) getElementsByAttribute(String key) (and related methods) Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling() Graph: parent(), children(), child(int index) 元素数据 attr(String key)获取属性attr(String key, String value)设置属性 attributes()获取所有属性 id(), className() and classNames() text()获取文本内容text(String value) 设置文本内容 html()获取元素内HTMLhtml(String value)设置元素内的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(String value)关于Jsoup的使用方法,具体可以参见Jsoup中文开发指南: Jsoup中文开发指南
本文为Eliot原创,转载请注明出处:http://blog.csdn.net/xyw_eliot/article/details/8927862