随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
在实际应用中,客户端要从网页上获取数据是常见的事,如果要解析网页上的html文档,那么首先得获取html源码,然后现在一般使用Jsoup来转换成Document文档来进行解析,本文主要讨论如何使用Jsoup把html文档解析成Document文档,方法归纳了6种,jar使用的是jsoup-1.6.1.jar,代码如下:
MainActivity:
package com.home.gethtml;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
import org.apache.http.util.EncodingUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity implements OnClickListener {
private Button btn;
private EditText showText;
private Handler handler;
private Document doc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.main_btn);
btn.setOnClickListener(this);
showText = (EditText) findViewById(R.id.main_et);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
showText.setText(doc + "");
}
};
}
@Override
public void onClick(View v) {
if (v == btn) {
new Thread() {
public void run() {
// 1.直接从字符串中输入HTML文档
// String html =
// "<html><head><title> 测试html的加载 </title></head>"
// + "<body><p> 这是一篇使用jsoup来加载html的文章 </p></body></html>";
// doc = Jsoup.parse(html);
// handler.sendEmptyMessage(0);
// 2.1 从 URL直接加载 HTML文档
// try {
// doc =
// Jsoup.connect("http://blog.youkuaiyun.com/u010142437").get();
// handler.sendEmptyMessage(0);
// } catch (IOException e) {
// e.printStackTrace();
// }
// 2.2 从 URL直接加载 HTML文档
// try {
// doc = Jsoup.connect("http://blog.youkuaiyun.com/u010142437")
// .data("query", "Java") // 请求参数
// .userAgent("I’m jsoup") // 设置 User-Agent
// .cookie("auth", "token") // 设置 cookie
// .timeout(5000) // 设置连接超时时间
// .post(); // 使用 POST方法访问 URL
// handler.sendEmptyMessage(0);
// } catch (IOException e) {
// e.printStackTrace();
// }
// 2.3从 URL直接加载 HTML文档
// try {
// doc = Jsoup.parse(new URL(
// "http://blog.youkuaiyun.com/u010142437"), 5000);
// handler.sendEmptyMessage(0);
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// 2.4从 URL直接加载 HTML文档:先使用流读取html,然后使用Jsoup转换成Document文档
// String html =
// getHtmlString("http://blog.youkuaiyun.com/u010142437");
// // 再使用第一种方式
// doc = Jsoup.parse(html);
// handler.sendEmptyMessage(0);
// 3.从sd卡文件中加载 HTML文档
File file = new File("/mnt/sdcard/test.html");
try {
// 第三个参数是baseURL,当 HTML文档使用相对路径方式引用外部文件时,jsoup会自动为这些
// URL加上baseURL这个前缀 。
doc = Jsoup.parse(file, "UTF-8",
"http://blog.youkuaiyun.com/");
handler.sendEmptyMessage(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
/**
* 使用URLConnection根据url读取html源代码
*
* @param urlString
* @return
*/
private String getHtmlString(String urlString) {
try {
URL url = new URL(urlString);
URLConnection ucon = url.openConnection();
InputStream instr = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(instr);
ByteArrayBuffer bau = new ByteArrayBuffer(500);
int current = 0;
while ((current = bis.read()) != -1) {
bau.append((byte) current);
}
return EncodingUtils.getString(bau.toByteArray(), "utf_8");
} catch (Exception e) {
return "";
}
}
}
布局xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/main_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="html源码:" />
<EditText
android:id="@+id/main_et"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:editable="false" />
</LinearLayout>
记得加上访问网络和读取sd卡文件的权限哦~。