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


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

  • 相关阅读:
    ios input readonly失效(点击的时候会有光标出现)/禁止输入法弹出问题
    sublime格式化
    菜单栏展开关闭效果(1)
    做数字判断显示相应的图标
    判断img的src为空/点击时候两张图片来回替换
    numpy
    pat甲级1085
    pat甲级1107
    2018.9.8pat秋季甲级考试
    pat甲级1044二分查找
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3366093.html
Copyright © 2020-2023  润新知