1.关于Jsoup
Jsoup是在Java中应用较为广泛的一种对HTML做解析的解析器,直接解析某个URL或本地的HTML文档内容,它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
常以Document对象做处理,如下:
Document doc = Jsoup.parse(html);
2.应用场景
例如我们想通过Jsoup抓取 :http://jwc.jxnu.edu.cn/ 内的部分信息
File input = new File("/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://jwc.jxnu.edu.cn/");
如上,我们将数据抓取下来,如下:
<HTML>
<HEAD>
<TITLE>
</TITLE> (其中所有内容省略)
</HEAD>
<BODY>
</BODY>
</HTML>
(如上,一个完整的HTML文本的必要内容,当然不完整的HTML的信息也可以做处理,下面将会提及,此处不做探讨)
接下来,我们将抓取来的HTML的信息做重要的一步操作,过滤。
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for(Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
}
以下:
package com.example.officer.myapplication;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ActionBarActivity {
public static final String TAG=MainActivity.class.getSimpleName();
//Document doc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context = this.getApplicationContext();
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
new Thread(runnable).start();
}
Runnable runnable = new Runnable(){
@Override
public void run() {
try {
String url = "http://jwc.jxnu.edu.cn/";
Connection conn = Jsoup.connect(url);
// 修改http包中的header,伪装成浏览器进行抓取
conn.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/ 20100101 Firefox/32.0");
Document doc = conn.get();
// 获取tbody元素下的所有tr元素
Elements elements = doc.select("tbody tr td div ul");
Log.v(TAG," "+elements.size());
for(Element element : elements) {
String companyName =element.getElementById("nav").getElementsByTag("a").text();
System.out.println("菜单选项"+companyName);
Toast.makeText(MainActivity.this,""+companyName,Toast.LENGTH_LONG).show();
}
}catch(Exception x){
x.printStackTrace();
}
// new MyTask().execute();
handler.sendEmptyMessage(0);
}
};
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
/**
* 处理UI
*/
// 当收到消息时就会执行这个方法
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
完成