您的位置:首页 > 移动开发 > Android开发

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的标签形式,解析方法相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: