Jsoup 解析Html源码实例

26 篇文章 0 订阅
23 篇文章 0 订阅

最近在做数据挖掘的过程中需要对html的源码进行解析,用到了Jsoup这个解析工具,下面写个基本实例来展现它的用法。

需要用到jar包:jsoup-1.7.2.jar,可以到jsoup的官网下载:http://jsoup.org/download

[java]  view plain copy print ?
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.sql.Timestamp;  
  4. import org.jsoup.Jsoup;  
  5. import org.jsoup.nodes.Document;  
  6. import org.jsoup.nodes.Element;  
  7.   
  8.   
  9. public class Main {  
  10.     public static void main(String[] args) throws IOException {  
  11.           
  12.         //解析url  
  13.         String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1";  
  14.         Document doc = (Document) Jsoup.connect(threadUrl).get();  
  15.         System.out.println(doc);  
  16.         //解析html文档  
  17.         //File input = new File("D:\\text.txt");  
  18.         //Document doc = Jsoup.parse(input, "UTF-8");     
  19.           
  20.         for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){  
  21.             if(!ele.select("td").toString().equals("")){  
  22.                 String url = ele.select("td").get(0).select("a").attr("href");  
  23.                 String text = ele.select("td").get(0).select("a").text();  
  24.                 String author = ele.select("td").get(1).select("a").text();  
  25.                 Integer click = Integer.valueOf(ele.select("td").get(2).text());  
  26.                 Integer reply = Integer.valueOf(ele.select("td").get(3).text());  
  27.                 Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00");  
  28.             }  
  29.         }         
  30.     }  
  31. }  
下面附上一部分要解析的源码内容:

[html]  view plain copy print ?
  1. <div class="mt5">   
  2.       <table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab-bbs-list tab-bbs-list-2">   
  3.        <colgroup>   
  4.         <col class="col-title" />   
  5.         <col class="" />   
  6.         <col class="" />   
  7.         <col class="" />   
  8.         <col class="col-date" />   
  9.        </colgroup>   
  10.        <tbody>   
  11.         <tr>   
  12.          <th scope="col"> 标题</th>   
  13.          <th scope="col">作者</th>   
  14.          <th scope="col">点击</th>   
  15.          <th scope="col">回复</th>   
  16.          <th scope="col">发表时间</th>   
  17.         </tr>   
  18.        </tbody>   
  19.        <tbody>   
  20.         <tr class="bg">   
  21.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td>   
  22.          <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td>   
  23.          <td>4</td>   
  24.          <td>1</td>   
  25.          <td title="2013-05-14 17:02">05-14 17:02</td>   
  26.         </tr>   
  27.         <tr>   
  28.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-484257-1.shtml" title="" target="_blank">五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点</a></td>   
  29.          <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td>   
  30.          <td>13</td>   
  31.          <td>0</td>   
  32.          <td title="2013-04-26 17:20">04-26 17:20</td>   
  33.         </tr>   
  34.         <tr class="bg">   
  35.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-483507-1.shtml" title="" target="_blank">无锡樱花温泉,梦回江南之境</a></td>   
  36.          <td><a href="http://www.tianya.cn/n/hauhuacaocao" target="_blank" class="author">hauhuacaocao</a></td>   
  37.          <td>36</td>   
  38.          <td>0</td>   
  39.          <td title="2013-04-24 16:14">04-24 16:14</td>   
  40.         </tr>   
  41.         <tr>   
  42.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-482981-1.shtml" title="" target="_blank">灵山大佛【无锡灵山大佛旅游攻略】灵山大佛游记</a></td>   
  43.          <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td>   
  44.          <td>38</td>   
  45.          <td>1</td>   
  46.          <td title="2013-04-22 19:03">04-22 19:03</td>   
  47.         </tr>   
  48.         <tr class="bg">   
  49.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-482796-1.shtml" title="" target="_blank">记江苏无锡的第一次骑行</a></td>   
  50.          <td><a href="http://www.tianya.cn/n/我的儿子叫孙好帅" target="_blank" class="author">我的儿子叫孙好帅</a></td>   
  51.          <td>73</td>   
  52.          <td>1</td>   
  53.          <td title="2013-04-22 09:31">04-22 09:31</td>   
  54.         </tr>   
  55.         <tr>   
  56.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-481470-1.shtml" title="" target="_blank">4月25日从重庆到南京-扬州-镇江-无锡-苏州-上海,自助,急求驴...</a></td>   
  57.          <td><a href="http://www.tianya.cn/n/伊叶飘" target="_blank" class="author">伊叶飘</a></td>   
  58.          <td>33</td>   
  59.          <td>0</td>   
  60.          <td title="2013-04-16 13:07">04-16 13:07</td>   
  61.         </tr>   
  62.         <tr class="bg">   
  63.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-478290-1.shtml" title="" target="_blank">无锡自由行</a></td>   
  64.          <td><a href="http://www.tianya.cn/n/龙在鑫" target="_blank" class="author">龙在鑫</a></td>   
  65.          <td>443</td>   
  66.          <td>10</td>   
  67.          <td title="2013-03-30 23:14">03-30 23:14</td>   
  68.         </tr>   
  69.         <tr>   
  70.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-475732-1.shtml" title="" target="_blank">无锡朋友-登山啦</a></td>   
  71.          <td><a href="http://www.tianya.cn/n/championjun" target="_blank" class="author">championjun</a></td>   
  72.          <td>16</td>   
  73.          <td>0</td>   
  74.          <td title="2013-03-18 16:48">03-18 16:48</td>   
  75.         </tr>  
下面分析上面的代码:

Jsoup可以通过打开指定url的方式或者直接打开html文档的方式,对源码进行解析。

打开url方式:

[java]  view plain copy print ?
  1. String threadUrl = "http://bbs.tianya.cn/list.jsp?item=travel&order=1&k=%E6%97%A0%E9%94%A1";  
  2. Document doc = (Document) Jsoup.connect(threadUrl).get();  
打开html文档:

[java]  view plain copy print ?
  1. File input = new File("D:\\text.txt");  
  2. 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

这是天涯论坛的某一个版块的内容,我要做的就是要提取里面的有用信息。

[java]  view plain copy print ?
  1. for(Element ele : doc.getElementsByClass("tab-bbs-list").get(0).select("tbody > tr")){  
  2.             if(!ele.select("td").toString().equals("")){  
  3.                 String url = ele.select("td").get(0).select("a").attr("href");  
  4.                 String text = ele.select("td").get(0).select("a").text();  
  5.                 String author = ele.select("td").get(1).select("a").text();  
  6.                 Integer click = Integer.valueOf(ele.select("td").get(2).text());  
  7.                 Integer reply = Integer.valueOf(ele.select("td").get(3).text());  
  8.                 Timestamp date = Timestamp.valueOf(ele.select("td").get(4).attr("title") + ":00");  
  9.             }  
  10.         }     
这个for循环做的是对有用信息的提取。首先,通过getElementsByClass("tab-bbs-list"),找到的是

[html]  view plain copy print ?
  1. <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)。

[java]  view plain copy print ?
  1. select("tbody > tr")  
指的是查找tbody下所有tr标签(此处多谢yenshen指正),现在就将范围缩小到了所有tbody的tr标签了,即:

[java]  view plain copy print ?
  1. <tr>   
  2.           <th scope="col"> 标题</th>   
  3.           <th scope="col">作者</th>   
  4.           <th scope="col">点击</th>   
  5.           <th scope="col">回复</th>   
  6.           <th scope="col">发表时间</th>   
  7.          </tr>   
  8.   
  9.  <tr class="bg">   
  10.           <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td>   
  11.           <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td>   
  12.           <td>4</td>   
  13.           <td>1</td>   
  14.           <td title="2013-05-14 17:02">05-14 17:02</td>   
  15.          </tr>   
  16.          <tr>   
  17.           <td class="td-title "><span class="face" title=""></span><a href="/post-travel-484257-1.shtml" title="" target="_blank">五一黄金假期狮王争霸赛霸气降临——盘点无锡影视城特色景点</a></td>   
  18.           <td><a href="http://www.tianya.cn/n/微笑小胖子" target="_blank" class="author">微笑小胖子</a></td>   
  19.           <td>13</td>   
  20.           <td>0</td>   
  21.           <td title="2013-04-26 17:20">04-26 17:20</td>   
  22.          </tr>   
  23. ....  
我们就是在一步步的缩小范围。现在已经定位到<tr>.....</tr>范围。
[java]  view plain copy print ?
  1. !ele.select("td").toString().equals("")  
表示说如果没有td这种标签,像第一个<tr>...<tr>,它内部就没有<td>标签,所以我们要过滤掉,因为我们需要提取的信息在<td>标签内。

如果存在<td>标签,现在ele已经定位到了<tr>,以第二个<tr>为例:

[java]  view plain copy print ?
  1. <tr class="bg">   
  2.          <td class="td-title "><span class="face" title=""></span><a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a></td>   
  3.          <td><a href="http://www.tianya.cn/n/utopia_rabbi" target="_blank" class="author">utopia_rabbi</a></td>   
  4.          <td>4</td>   
  5.          <td>1</td>   
  6.          <td title="2013-05-14 17:02">05-14 17:02</td>   
  7.         </tr>   


[java]  view plain copy print ?
  1. ele.select("td").get(0).select("a").attr("href");  
ele.select("td")是检索出所有的<td>,后边的get(0),指定了是定位到第一个<td>,即:
[java]  view plain copy print ?
  1. <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>标签:

[java]  view plain copy print ?
  1. <a href="/post-travel-489511-1.shtml" title="" target="_blank">求无锡周边带娃踏青的路线</a>  
.attr("href"):这个方法是获取属性名称为href的属性,即:"/post-travel-489511-1.shtml"

这样,我们就提取到了url。

text():方法是获取标签的内容

[java]  view plain copy print ?
  1. String text = ele.select("td").get(0).select("a").text();  
我们定位到了<a>...</a>,text()就是取得<a>...</a>之间的内容。

附:

[plain]  view plain copy print ?
  1. Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:  
  2.   
  3. 查找元素  
  4. getElementById(String id)   
  5. getElementsByTag(String tag)   
  6. getElementsByClass(String className)   
  7. getElementsByAttribute(String key) (and related methods)   
  8. Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()   
  9. Graph: parent(), children(), child(int index)  
  10. 元素数据  
  11. attr(String key)获取属性attr(String key, String value)设置属性   
  12. attributes()获取所有属性   
  13. id(), className() and classNames()   
  14. text()获取文本内容text(String value) 设置文本内容   
  15. html()获取元素内HTMLhtml(String value)设置元素内的HTML内容   
  16. outerHtml()获取元素外HTML内容   
  17. data()获取数据内容(例如:script和style标签)   
  18. tag() and tagName()  
  19. 操作HTML和文本  
  20. append(String html), prepend(String html)   
  21. appendText(String text), prependText(String text)   
  22. appendElement(String tagName), prependElement(String tagName)   
  23. html(String value)  
关于Jsoup的使用方法,具体可以参见Jsoup中文开发指南: Jsoup中文开发指南
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值