android webview jsoup,android使用Jsoup 抓取页面的数据

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

从一个URL,文件或字符串中解析HTML;

使用DOM或CSS选择器来查找、取出数据;

可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

Jsoup类下面的方法都是静态可直接调用。几个方法的说明

Connect()方法,获得一个Connection,然后调用Connection对象get()方法获得Document对象。然后再解析Document对象  Connection提供了一些设置方法timeout(),url()等等

这里贴一下我用到的 Java工程的测试代码

package com.javen.Jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

public class JsoupTest {

static String url="http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html";

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

BolgBody();

//test();

//Blog();

/*

* Document doc = Jsoup.connect("https://www.jb51.net/")

* .data("query", "Java") // 请求参数 .userAgent("I ' m jsoup") // 设置

* User-Agent .cookie("auth", "token") // 设置 cookie .timeout(3000) //

* 设置连接超时时间 .post();

*/// 使用 POST 方法访问 URL

/*

* // 从文件中加载 HTML 文档 File input = new File("D:/test.html"); Document doc

* = Jsoup.parse(input,"UTF-8","https://www.jb51.net/");

*/

}

/**

* 获取指定HTML 文档指定的body

* @throws IOException

*/

private static void BolgBody() throws IOException {

// 直接从字符串中输入 HTML 文档

String html = "

开源中国社区 "

+ "

这里是 jsoup 项目的相关文章

";

Document doc = Jsoup.parse(html);

System.out.println(doc.body());

// 从 URL 直接加载 HTML 文档

Document doc2 = Jsoup.connect(url).get();

String title = doc2.body().toString();

System.out.println(title);

}

/**

* 获取博客上的文章标题和链接

*/

public static void article() {

Document doc;

try {

doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get();

Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle");

for (Element element :ListDiv) {

Elements links = element.getElementsByTag("a");

for (Element link : links) {

String linkHref = link.attr("href");

String linkText = link.text().trim();

System.out.println(linkHref);

System.out.println(linkText);

}

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 获取指定博客文章的内容

*/

public static void Blog() {

Document doc;

try {

doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get();

Elements ListDiv = doc.getElementsByAttributeValue("class","postBody");

for (Element element :ListDiv) {

System.out.println(element.html());

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

下面来介绍android中使用Jsoup异步解析网页的数据 请注意: 这里很容易遇到一个乱码的问题

配置文件:AndroidManifest.xml中加 权限

layout的布局文件

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/webView"

android:layout_width="fill_parent"

android:layout_height="200dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content" >

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

主要异步加载数据的代码

package com.javen.aaa;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.URL;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.AsyncTask;

import android.os.Bundle;

import android.util.Log;

import android.webkit.WebView;

import android.widget.TextView;

public class MainActivity extends Activity {

private WebView webView;

private TextView textView;

private static final int DIALOG_KEY = 0;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

webView = (WebView) findViewById(R.id.webView);

textView=(TextView) findViewById(R.id.textView);

try {

ProgressAsyncTask asyncTask=new ProgressAsyncTask(webView,textView);

asyncTask.execute(10000);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public String test() {

StringBuffer buffer=new StringBuffer();

Document doc;

try {

doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get();

Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle");

for (Element element :ListDiv) {

Elements links = element.getElementsByTag("a");

for (Element link : links) {

String linkHref = link.attr("href");

String linkText = link.text().trim();

buffer.append("linkHref=="+linkHref);

buffer.append("linkText=="+linkText);

System.out.println(linkHref);

System.out.println(linkText);

}

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return buffer.toString();

}

// 弹出"查看"对话框

@Override

protected Dialog onCreateDialog(int id) {

switch (id) {

case DIALOG_KEY: {

ProgressDialog dialog = new ProgressDialog(this);

dialog.setMessage("获取数据中 请稍候...");

dialog.setIndeterminate(true);

dialog.setCancelable(true);

return dialog;

}

}

return null;

}

public static String readHtml(String myurl) {

StringBuffer sb = new StringBuffer("");

URL url;

try {

url = new URL(myurl);

BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), "gbk"));

String s = "";

while ((s = br.readLine()) != null) {

sb.append(s + "\r\n");

}

} catch (Exception e) {

e.printStackTrace();

}

return sb.toString();

}

class ProgressAsyncTask extends AsyncTask {

private WebView webView;

private TextView textView;

public ProgressAsyncTask(WebView webView,TextView textView) {

super();

this.webView=webView;

this.textView=textView;

}

/**

* 这里的Integer参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数

* 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改

* 但是可以调用publish Progress方法触发onProgressUpdate对UI进行操作

*/

@Override

protected String doInBackground(Integer... params) {

String str =null;

Document doc = null;

try {

// String url ="http://www.cnblogs.com/zyw-205520/p/3355681.html";

//

// doc= Jsoup.parse(new URL(url).openStream(),"utf-8", url);

// //doc = Jsoup.parse(readHtml(url));

// //doc=Jsoup.connect(url).get();

// str=doc.body().toString();

doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get();

Elements ListDiv = doc.getElementsByAttributeValue("class","postBody");

for (Element element :ListDiv) {

str=element.html();

System.out.println(element.html());

}

Log.d("doInBackground", str.toString());

System.out.println(str);

//你可以试试GBK或UTF-8

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return str.toString() ;

//return test();

}

/**

* 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)

* 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置

*/

@Override

protected void onPostExecute(String result) {

webView.loadData(result, "text/html;charset=utf-8", null);

textView.setText(result);

removeDialog(DIALOG_KEY);

}

// 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置

@Override

protected void onPreExecute() {

showDialog(DIALOG_KEY);

}

/**

* 这里的Intege参数对应AsyncTask中的第二个参数

* 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行

* onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作

*/

@Override

protected void onProgressUpdate(Integer... values) {

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值