今天学习一下用Jsoup解析Html网页和Epub文档
首先把Jsoup的jar包放入工程的libs文件夹下(jsoup jar包大家可以去github或者网上搜索下载)
我们解析的地址为csdn移动板块 点击打开链接http://mobile.csdn.net/
首先在MainActivity.class中添加如下代码:
//要解析的HTML地址
private String url="http://mobile.csdn.net/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseHtml();
}
我们打开 要解析的html网页分析一下页面源码
网页内容:
下面看一下它的源码:
我们要解析出文章的标题 就要找到文章列表开始的标签 图中第一个红框标识的位置<div class="unit">就是文章列表的开始标签(不太明白的同学可以先了解一下html的基本知识),所以此处我们用Elements elements=doc.select("div.unit")来获取要解析的标签,然后用element.getElementsByTag("h1").first().text()方法获取文章标题,用element.getElementsByTag("h1").first().getElementsByTag("a").first().attr("src")获取<h1>标签下<a>标签后的链接,具体代码如下:
/**
* 解析HTML
*/
private void parseHtml() {
new Thread(){
public void run() {
try {
//GET方法请求数据
Document doc=Jsoup.connect(url).get();
//选择要解析的元素标签
Elements elements=doc.select("div.unit");
for (Element element : elements) {
String title=element.getElementsByTag("h1").first().text();
String href=element.getElementsByTag("h1").first().getElementsByTag("a").first().attr("src");
Message msg=new Message();
msg.obj=(title+"--"+href);
msg.what=1;
mHandler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
由于网络连接解析数据属于耗时操作,此处我们放在子线程中操作,获取到数据后我们发送消息给主线程,在MainActivity.class添加如下代码接收子线程发来的消息:
private Handler mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==1) {
String str=msg.obj.toString();
Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show();
System.out.println("--str--"+str);
}
};
};
然后在清单文件中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
运行,控制台输出以下内容:
Html网页解析成功,下面我们解析Epub文档:
要解析的事先下好的Epub文件放入assets文件夹下:
由于和解析html几乎相同,这里就直接列出代码:
在MainActivity.class添加如下方法:
/**
* 解析Epub
*/
private void parseEpub(){
try {
//打开文件
InputStream is=getAssets().open("fb.ncx");
int size=is.available();
byte buffer[]=new byte[size];
is.read(buffer);
is.close();
String epubType=new String(buffer,"utf-8");
Document doc=Jsoup.parse(epubType);
String doctitle=doc.getElementsByTag("docTitle").first().text();
Elements elements=doc.getElementsByTag("navPoint");
for (Element element : elements) {
String title=element.text();
String href=element.getElementsByTag("content").attr("href");
Message msg=new Message();
msg.obj=title+"=="+href;
msg.what=1;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
然后在onCreate()中调用此方法,运行后得到以下结果:
至此,完成html和epub的解析:
全部代码如下:
public class MainActivity extends Activity {
//要解析的HTML地址
private String url="http://mobile.csdn.net/";
private Handler mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==1) {
String str=msg.obj.toString();
Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show();
System.out.println("--str--"+str);
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//parseHtml();
parseEpub();
}
/**
* 解析HTML
*/
private void parseHtml() {
new Thread(){
public void run() {
try {
//GET方法请求数据
Document doc=Jsoup.connect(url).get();
//选择要解析的元素标签
Elements elements=doc.select("div.unit");
for (Element element : elements) {
String title=element.getElementsByTag("h1").first().text();
String href=element.getElementsByTag("h1").first().getElementsByTag("a").first().attr("src");
Message msg=new Message();
msg.obj=(title+"--"+href);
msg.what=1;
mHandler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
/**
* 解析Epub
*/
private void parseEpub(){
try {
//打开文件
InputStream is=getAssets().open("fb.ncx");
int size=is.available();
byte buffer[]=new byte[size];
is.read(buffer);
is.close();
String epubType=new String(buffer,"utf-8");
Document doc=Jsoup.parse(epubType);
String doctitle=doc.getElementsByTag("docTitle").first().text();
Elements elements=doc.getElementsByTag("navPoint");
for (Element element : elements) {
String title=element.text();
String href=element.getElementsByTag("content").attr("href");
Message msg=new Message();
msg.obj=title+"=="+href;
msg.what=1;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
欢迎关注微博,互相交流技术! 点击这里关注http://weibo.com/momo91