Android之Jsoup解析Html抓包其他网站数据

时间:2022-10-31 09:10:02

有时候开发Android客户端时,没有大量的数据,而且懒得自己收集数据,那么就可以尝试用Jsoup解析其他网站的数据。

我以解析我们学校网站的一条通知为例

即下图:

Android之Jsoup解析Html抓包其他网站数据

①首先应制定数据在什么标签中,可以通过按F12

Android之Jsoup解析Html抓包其他网站数据

②然后就准备看数据所在标签了

Android之Jsoup解析Html抓包其他网站数据

可以发现,通知的所有数据都在span标签中,而页面中肯定有很多的span标签,所以知道“通知”的数据在span标签中还不够,还要看我们要的这些span标签所在的容器是哪一个,这里的上一级容器是有td、p、b、tbody、div等,但是我们需要通过class或者id名去找到这个容器的标签,所以就得找div的id为wrap的这个容器了(这网站也不知道是谁写的,标签都不加id或者class,而且将通知写在表格中……也是够了……)

③接下来就是用代码去解析了,首先应该先得到这个网页,但是吧,我通过Jsoup的Jsoup.connect(urlString).get()方法得到的document竟然是空的……反正网上都是这么去得到网页的,但是我试了N次都拿不到这个Document.还是用我自己的办法吧。

我自己封装了一个HttpClient的方法去获取网页所有数据

public static String sendAndgetString(String url) {
		String serverDataString = null;
		HttpGet get = new HttpGet(url);
		try {
			HttpClient client = new DefaultHttpClient();
			HttpResponse response = client.execute(get);
			int code = response.getStatusLine().getStatusCode();
			Log.i("bzjm", "StatusCode:" + code);

			if (code == 200) {
				serverDataString = EntityUtils.toString(response.getEntity(),"gb2312");
				
				Log.i("bzjm", "接收字符串数据成功\nServerData:"+serverDataString);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return serverDataString;
	}


因为我们学校的教务系统的编码是gb2312的,所以,编码必须是gb2312,否则的话中文就成乱码了,所以大家在解析别人的网站的时候,一定要看一眼,这个网站的编码是什么,再去解析,不然,得到的中文数据很可能是乱码哦

 

④开始解析了,代码中注释的很清楚了,直接看代码就好了,还有问题的可以留言哦

package com.zml.parsehtml;

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.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.zml.practice.R;
import com.zml.utils.HttpUtils;

/**
 * @author 郑明亮
 * @Time:2016-3-14 下午1:26:42
 * @version 1.0
 */
public class ParseHTMLActivity extends Activity {
	private TextView tv_showHtml;
	String urlString = "http://jwc.heuet.edu.cn/index.html";
	Document document;
	StringBuffer sb = new StringBuffer();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_parsehtml);
		tv_showHtml = (TextView) findViewById(R.id.tv_showhtml);

		new MyTask().execute();
	}

	private class MyTask extends AsyncTask<Void, Void, String> {
		String urlString = "http://jwc.heuet.edu.cn/html/news/1/20163/news_566.html";
		Document document;
		StringBuffer sb = new StringBuffer();

		@Override
		protected String doInBackground(Void... params) {
			// 拿到网页的所有html数据
			String textString = HttpUtils.sendAndgetString(urlString);
			try {
				// document = Jsoup.connect(urlString).get();
				// 将html字符串解析为document对象
				document = Jsoup.parse(textString);
				String hrefString;
				// 先拿到id为#wrap的div
				Elements div = document.select("#wrap");
				// 然后去拿这个div中的所有span标签
				Elements spans = div.select("span");
				sb.append("通知:\n");
				// 因为拿到了很多的span标签,所以需要从span标签中一个个拿出数据
				for (Element element : spans) {
					// String href = element.select("a[href]");
					hrefString = element.getElementsByTag("span").text();
					// name =
					// element.getElementsByTag("a").attr("href").text();//这个是拿超链接的链接的
					sb.append(hrefString);
				}

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
			return sb.toString();
		}

		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			Toast.makeText(getApplicationContext(), result, 1).show();
			if (result != null) {
				tv_showHtml.setText(result);
			}

		}
	}
}

解析后显示在TextView上的数据:

Android之Jsoup解析Html抓包其他网站数据

Jsoup需要用的jar包  从这下载哦~
 

如果,您认为这篇博客让您有些收获,不妨点击一下【】。

如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。

因为,我的热情需要您的肯定和支持。 

感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!