一、Jsoup介绍
Jsoup是一款java的HTML解析器,可直接解析某个URL、HTML文本内容。他提供了一套非常具有效率的API,可通过DOM,CSS以及类似于Jquery的操作方法取出和操作数据。包涵支持HTML5的解析器分支,可确保跟现在的浏览器一样解析HTML的方法,同时降低了解析的时间和内存的占用。
主要功能与特点如下:
1.从一个URL,文件或字符串中解析HTML。
2.使用DOM或CSS选择器来查找和取出数据。
3.可操作HTML元素、属性和文本。
4.Jsoup是基于MIT协议发布的,安全性较高。
二、HttpClient介绍
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,HttpClient提供了很多特性,支持最新的HTTP标准。从名字上可以看出,他是一个简单的HTTP客户端(不是浏览器),可以发送HTTP请求,接收HTTP响应,但不会缓存服务器的响应,不能执行HTTP页面中嵌入的JS代码,自然也不会对页面内容进行解析、处理,这些都是需要开发人员自个儿编码完成。HttpClient的本质是一个模拟浏览器跟服务器通信的工具,他代替了浏览器向服务器发送请求并接收服务器的回应,然后配合Jsoup解析并响应报文,最后抓取到自己需要的东西。
主要功能如下:
1.实现了所有HTTP的方法(GET、POST、PUT和HEAD等)。
2.支持自动转向。
3.支持HTTPS协议。
4.支持代理服务器等。
三、Jsoup基本用法
1.在项目工程下添加依赖库。
//Jsoupcompile 'org.jsoup:jsoup:1.9.2'2.Jsoup方法解析网页。
PRivate void parseHtml() { try { doc = Jsoup.connect(url).get(); Elements elements = doc.select("div.unit"); for (Element ele : elements) { String title = ele.getElementsByTag("h1").first().text(); String href = ele.getElementsByTag("h1").first() .getElementsByTag("a").first().attr("href"); // logcat中打印出“新闻标题+链接地址” Log.i("info", title + ":" + href); mListTitle.add(title); } mListTitle.add(mStrTime); } catch (IOException e) { e.printStackTrace(); } mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mListTitle); hander.post(runnableUi);}3.设置主线程更新UI操作。
hander = new Handler();new Thread(new Runnable() { @Override public void run() { parseHtml(); }}).start();Runnable runnableUi = new Runnable() { @Override public void run() { setListAdapter(mAdapter); }};4.添加解析时间(纯属用于比较与HttpClient的区别,以时间观察解析速度)。
mFirDate = new Date(System.currentTimeMillis());timeFirst = mFirDate.getTime();四、HttpClient基本用法
1.在项目工程下添加依赖库。
//添加HttpClientuseLibrary 'org.apache.http.legacy'2.异步方式加载数据。
/** * 异步方式加载数据 */private class RequestTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { //在doInBackground方法中,做一些诸如网络请求等耗时操作。 return RequestData(); } /** * onPostExecute方法主要是主线程中的数据更新。 */ @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null) { //如果获取的result数据不为空,那么对其进行JSON解析。并显示在手机屏幕上。 JSONAnalysis(result); } else if (result == null) { Toast.makeText(HttpClientNetActivity.this, "请求数据失败", Toast.LENGTH_LONG).show(); } }}3.请求网络数据,该处使用HttpClient方法。
/** * 网络请求,这里用的是HttpClient * * @return */public String RequestData() { HttpGet get = new HttpGet(url); HttpClient client = new DefaultHttpClient(); StringBuilder builder = null; try { HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { InputStream inputStream = response.getEntity().getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream)); builder = new StringBuilder(); String s = null; for (s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } } } catch (Exception e) { e.printStackTrace(); } return builder.toString();}4.将请求返回的数据进行JSON解析。
/** * 对请求回来的数据进行JSON解析。 * * @param result */public void JSONAnalysis(String result) { JSONTokener(result); Document document = Jsoup.parse(result); Elements elements = document.select("div.unit"); for (Element ele : elements) { String title = ele.getElementsByTag("h1").first().text(); String href = ele.getElementsByTag("h1").first() .getElementsByTag("a").first().attr("href"); // logcat中打印出“新闻标题+链接地址” Log.i("info", title + ":" + href); mListTitle.add(title); } mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mListTitle); setListAdapter(mAdapter);}5.请求返回的HTML文本代码的编码有时会出现问题,这与网页的编码方式有关,我们在此处进行异常处理。
/** *解决编码异常问题 * @param in * @return */public String JSONTokener(String in) { if (in != null && in.startsWith("/ufeff")) { in = in.substring(1); } return in;}6. 添加解析时间(目的同Jsoup,用于比较解析时间)。
mFirDate = new Date(System.currentTimeMillis());timeFirst = mFirDate.getTime();五、效果展示
![]()
六、源码下载
地址:http://download.csdn.net/detail/u012721519/9743735
Good luck!
Write by Jimmy.li
新闻热点
疑难解答