Android Jsoup:实现HTML解析和Epub解析
2015-11-04 23:42
260 查看
概述
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;
jsoup是基于MIT协议发布的,可放心使用于商业项目。
jsoup 的基本使用方法:Jsoup中文使用手册
示例1: 练习 jsoup 的基本使用方法
在Eclipse中使用记得带入jsoup-x.xx.x.jar库文件,下载地址:下载 jsoup-x.xx.x.jar库文件public class MainActivity extends Activity { private String html = "<html><head><title>Jsoup用法</title></head>" + "<body><p><a href='http://baidu.com'>这里是 jsoup 项目的相关文章</a></p></body></html>"; private String url = "http://www.baidu.com"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // html文本,url,本地html Document doc = Jsoup.parse(html); doc.title(); Elements eles = doc.getElementsByTag("a"); // a标签 // 遍历Elements的每个Element for (Element link : eles) { String linkHref = link.attr("href"); // a标签的href属性 String text = link.text(); } // 使用选择器语法来查找元素 Elements elements = doc.select("a[href]"); Elements elements2 = doc.select("img[src$=.png]"); Element element3 = doc.select("div.className").first(); // 数据修改 doc.select("div.className").attr("key", "value"); doc.select("div.className").addClass("myclass"); // class="myclass" doc.select("img").removeAttr("onclick"); // 消除不受信任的html (来防止xss攻击) String htmls = ""; // 不安全的 String safe = Jsoup.clean(htmls, Whitelist.basic()); // 安全的 try { Document doc2 = Jsoup.connect(url).get(); } catch (IOException e) { e.printStackTrace(); } try { Document doc3 = Jsoup.connect(url).data("key", "value") .timeout(3000).post(); } catch (IOException e) { e.printStackTrace(); } // 若根目录有个index.html文件,否则程序会crash File input = new File(Environment.getExternalStorageDirectory() + "/index.html"); try { Document doc4 = Jsoup.parse(input, "utf-8", "http://baidu.com"); } catch (IOException e) { e.printStackTrace(); } // ../baidu.png -> http://baidu.com/baidu.png } }
示例2:使用Jsoup解析HTML新闻列表
新闻地址是:http://mobile.csdn.net/<div class="unit"> <h1><a href="http://www.csdn.net/article/2015-11-02/2826103-jinjiang-beecloud" target="_blank">《近匠》BeeCloud创始人黄君贤:三行代码集成支付的技术实现</a></h1> <h4>发表于<span class="ago">2015-11-03 18:18</span>|<span class="view_time">4471次阅读</span>|<span class="num_recom">11条评论</span></h4> <dl> <dt> <a href="http://www.csdn.net/article/2015-11-02/2826103-jinjiang-beecloud" target="_blank"><img src="http://img.ptcms.csdn.net/article/201511/03/5638562e9dde2_thumb.jpg" alt="" /></a> </dt> <dd> 《近匠》第106期:成立于2014年的BeeCloud专注于支付云服务,以“让支付更简单”为理念,为开发者及企业提供一站式支付解决方案。其推出的“秒支付Button”无需SDK,三行代码即可一键接入支付功能。 </dd> </dl> <div class="tag"> <a href="http://www.csdn.net/tag/%E8%BF%91%E5%8C%A0/news" target="_blank">近匠</a> <a href="http://www.csdn.net/tag/beecloud/news" target="_blank">BeeCloud</a> <a href="http://www.csdn.net/tag/google/news" target="_blank">Google</a> <a href="http://www.csdn.net/tag/%E9%BB%84%E5%90%9B%E8%B4%A4/news" target="_blank">黄君贤</a> <a href="http://www.csdn.net/tag/%E6%94%AF%E4%BB%98/news" target="_blank">支付</a> <a href="http://www.csdn.net/tag/sdk/news" target="_blank">SDK</a> </div> </div> <div class="unit"> <h1><a href="http://www.csdn.net/article/2015-11-03/2826114" target="_blank">专访贾磊:百度语音实现技术创新,打破汉语语音识别领域壁垒</a></h1> <h4>发表于<span class="ago">2015-11-03 14:58</span>|<span class="view_time">186次阅读</span>|<span class="num_recom">1条评论</span></h4> <dl> <dt> <a href="http://www.csdn.net/article/2015-11-03/2826114" target="_blank"><img src="http://img.ptcms.csdn.net/article/201511/03/563858fcac8a2_thumb.jpg" alt="" /></a> </dt> <dd> 语音识别技术正处于大规模爆发边缘,更多终端会进入语音操作时代。近日百度在汉语语音识别方面获得重大理论和产品突破,CSDN对百度语音技术部负责人贾磊进行了专访,他分享了这次技术突破的理论基础和学术意义。 </dd> </dl> <div class="tag"> <a href="http://www.csdn.net/tag/%E5%A4%A7%E6%95%B0%E6%8D%AE/news" target="_blank">大数据</a> <a href="http://www.csdn.net/tag/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB/news" target="_blank">语音识别</a> <a href="http://www.csdn.net/tag/%E4%B8%93%E8%AE%BF/news" target="_blank">专访</a> <a href="http://www.csdn.net/tag/%E7%99%BE%E5%BA%A6/news" target="_blank">百度</a> <a href="http://www.csdn.net/tag/%E6%8A%80%E6%9C%AF/news" target="_blank">技术</a> <a href="http://www.csdn.net/tag/%E8%AF%AD%E9%9F%B3%E6%90%9C%E7%B4%A2/news" target="_blank">语音搜索</a> <a href="http://www.csdn.net/tag/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/news" target="_blank">机器学习</a> <a href="http://www.csdn.net/tag/%E4%BA%BA%E6%9C%BA%E4%BA%A4%E4%BA%92/news" target="_blank">人机交互</a> <a href="http://www.csdn.net/tag/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/news" target="_blank">深度学习</a> </div> </div> <div class="unit"> <h1><a href="http://www.csdn.net/article/2015-11-03/2826110-CTO" target="_blank">【CTO讲堂】Growth Hacking背后,数据分析平台的架构调整</a></h1> <h4>发表于<span class="ago">2015-11-03 11:05</span>|<span class="view_time">949次阅读</span>|<span class="num_recom">6条评论</span></h4> <dl> <dt> <a href="http://www.csdn.net/article/2015-11-03/2826110-CTO" target="_blank"><img src="http://img.ptcms.csdn.net/article/201511/03/56382497a487e_thumb.jpg" alt="" /></a> </dt> <dd> Growth Hacking概念越来越火,很多创业团队把这个为Facebook、Airbnb等公司带来巨大用户增量的概念奉为圣经。与数据分析的关系是怎样的?现有的数据分析架构为什么不能支持需求?本文为诸葛io创始人&CEO孔淼的分享。 </dd> </dl> <div class="tag"> <a href="http://www.csdn.net/tag/cto%E4%BF%B1%E4%B9%90%E9%83%A8/news" target="_blank">CTO俱乐部</a> <a href="http://www.csdn.net/tag/cto/news" target="_blank">CTO</a> <a href="http://www.csdn.net/tag/cto%E8%AE%B2%E5%A0%82/news" target="_blank">CTO讲堂</a> <a href="http://www.csdn.net/tag/growth%20hacking/news" target="_blank">Growth Hacking</a> <a href="http://www.csdn.net/tag/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/news" target="_blank">数据分析</a> </div> </div> <div class="unit"> ...
分析可知,每个条新闻item都在下面这个标签中
<div class="unit"> ... </div>
在安卓中解析的代码如下:
public class MainActivity extends Activity { private String url = "http://mobile.csdn.net/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { parseHtml(); } }).start(); } private void parseHtml() { try { Document doc = Jsoup.connect(url).get(); Elements elements = doc.select("div.unit"); for (Element ele : elements) { String title = ele.getElementsByTag("h1").first().text(); String href = ele.getElementsByTag("h1").first() .getElementsByTag("a").first().attr("href"); // logcat中打印出“新闻标题+链接地址” Log.i("info", title + ":" + href); } } catch (IOException e) { e.printStackTrace(); } } }
打印日志如下图:
Epub的目录结构也是类似HTML的标签形式,解析方法相同。
相关文章推荐
- Android Studio: 引用jar及so文件
- android----关于使用Genymotion模拟器产生的错误Unable to establish a connection to adb
- mac android studio 配置 ndk
- [转]Android Message.obtain() 和Handler.obtainMessage()的区别
- android base64/32编码
- 在android中使用自定义组件
- Android应用开发判断一个Activity是否正在运行
- 关于Android文件路径的记录
- Android activity 启动模式 详解
- Android总结——Android四大控件
- Android开发&短信拦截与读取,消息通知Notification
- Android上dip、dp、px、sp等单位说明(转)
- Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新
- Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新
- 【个人向】Android回调接口的实现方法
- android 学习 Spinner控件的使用
- Android 通过拍照或相册选择图片并裁剪(精简版)
- Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法
- 自定义控件,圆角矩形(drawRoundRect)
- android 蓝牙断开监听