有时候开发Android客户端时,没有大量的数据,而且懒得自己收集数据,那么就可以尝试用Jsoup解析其他网站的数据。
我以解析我们学校网站的一条通知为例
即下图:
①首先应制定数据在什么标签中,可以通过按F12
②然后就准备看数据所在标签了
可以发现,通知的所有数据都在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上的数据:
Jsoup需要用的jar包 从这下载哦~
如果,您认为这篇博客让您有些收获,不妨点击一下【顶】。
如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。
因为,我的热情需要您的肯定和支持。
感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!