在android客户端加载html源代码总结

时间:2022-11-01 09:17:35

在实际应用中,客户端要从网页上获取数据是常见的事,如果要解析网页上的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.csdn.net/u010142437").get();
					// handler.sendEmptyMessage(0);
					// } catch (IOException e) {
					// e.printStackTrace();
					// }

					// 2.2 从 URL直接加载 HTML文档
					// try {
					// doc = Jsoup.connect("http://blog.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/");
						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卡文件的权限哦~。