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

时间:2022-10-31 10:20:20

有时候开发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!