在实际应用中,客户端要从网页上获取数据是常见的事,如果要解析网页上的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卡文件的权限哦~。