最近在做数据挖掘的过程中需要对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 {//解析urlString 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

Jsoup 解析Html源码实例相关推荐

  1. 二当家的官网微信小程序源码实例解析

    版权声明:转载请注明原创地址 https://blog.csdn.net/u013032788/article/details/54376774 二当家的官网微信小程序源码实例解析,微信小程序开发教程 ...

  2. 【Unity】 Spine渲染原理解析与源码解读

    Spine渲染原理解析与源码解读 安装环境 从Spine编辑器导出 将资源导入Unity 基础概念 其他相关概念 Spine架构 Spine运行时的各个模块 有状态(Stateful) 和 无状态(S ...

  3. (源码实例)通过层DIV实现,当鼠标放在链接上面,显示图片及文字

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (源码实 ...

  4. jsoup解析HTML及简单实例

    jsoup 中文参考文献    http://www.open-open.com/jsoup/ 本文将利用jsoup,简单实现网络抓取的功能,并给出一个小实例,该实例效果为:获取作者本人在博客园写的所 ...

  5. DPDK 跟踪库tracepoint源码实例分析

    DPDK笔记 DPDK 跟踪库tracepoint源码实例分析 RToax 2021年4月 注意: 跟踪库 基于DPDK 20.05 DPDK跟踪库:trace library 1. trace流程源 ...

  6. Java定时任务(一) Timer及TimerTask的案例解析及源码分析

    Java定时任务(一)  Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...

  7. php项目素材,PHP素材资源解析平台源码V8.0(thinkPHP框架内核)

    PHP素材资源解析平台源码V8.0 第三方平台下载千图网千库网等素材网站下载站 V8版本.十月一日最 新更新,全新的解析架构. 小白问题一:为什么我不能解析? 答:解析是需要开通目标站VIP的. 小白 ...

  8. 2022最新素材解析网站源码搭建和原理,附带PHP小例子。

    一站式素材解析网站源码,资源素材共享网站源码,素材网解析规则分享,素材网站解析下载系统,素材资源解析平台系统源码,素材解析网站制作. 我算是比较早接触素材网站的,因为之前就是做设计的,那时候没那么多套 ...

  9. ASP网站整站程序PHP源码-打听网(wordpress打造cms)-wordpress-cms整站打包程序-毕设源码实例

    ASP网站整站程序PHP源码-打听网(wordpress打造cms)-wordpress-cms,整站打包程序,毕设源码实例,用wordpress中文做成的源码.全站打包,可以自行修改就行. 使用PH ...

最新文章

  1. :x 和 :wq 的区别
  2. map,filter,reduce函数总结
  3. QML 发光呼吸动画字体
  4. python的智能算法_scikit-opt——Python中的群体智能优化算法库
  5. JSP的三六九四七(三大指令、六大标签、九大内置对象、四大作用域、七个动作指令)
  6. 使用openssl完成aes-ecb模式的数据加解密,输入和输出都是字符串类型
  7. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
  8. Centos服务器查看当前的并发数
  9. 喜茶多名员工与外卖小哥互殴 喜茶官方:辞退!
  10. SQL server 2005的复制(四)
  11. RabbitMQ交换器Exchange
  12. vim 配置文件 (未完待续)
  13. 在Word中的方框里打对勾都有哪些方法?☑☑☑
  14. 前端(HTML+CSS+JS)
  15. 8.4.1 搭建自己的SSR
  16. Excel中将一列数字格式,一次性转换为文本格式
  17. 如何实现输入银行卡号每隔四位自动添加一个空格的功能?
  18. MATLAB 学习笔记(2)MATLAB 矩阵的加减乘除运算
  19. 手机显示系统检测您正在通过代理服务器,当手机无线网出现“检测到您正在使用多个终端共享上网,网络访问被冻结15...
  20. 【WCN685X】WCN6856 5G吞吐量测试只有25Mbps问题原因分析及解决方案

热门文章

  1. 随机森林的java算法_spark 随机森林算法案例实战
  2. Android的六大基本布局
  3. 【运营】0-1搭建自媒体用户运营分析报告——以B站为例
  4. 单片机开发和嵌入式开发流程图
  5. revit管线插件:当前楼层怎么显示楼板以下的给排水管道?
  6. NAND FLASH -WARMUP CYCLE
  7. PHP unlink的使用
  8. element组件树形控件el-tree点击展开节点,节点重影
  9. 2021年江苏高考成绩查询时间,2021年江苏高考成绩什么时候出来 公布时间
  10. 使用tar分别压缩文件夹为文件