最近遇到一个工作需要从新浪财经网页拉取某支股票的当天成交明细,于是乎发现了一个好用的第三方包,在这里跟大家分享一下。
这个包叫Jsoup包,jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。
jar包(点击下载)
中文api文档(点击查看)
接下就来通过我这个项目来说明一下如何解析html
1.分析相应的html代码。
我要拉取的网页是http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php?symbol=sh601988&date=2016-07-26&page=41
这是网页上显示的表格:
我们要获取这个股票每个成交时间的成交价和涨跌幅。
查看网页源代码发现主要这几行:
数据是在一个叫datatb1的表格里面。
2.这里源代码有接近有一千行,用Jsoup来解析就比较方便快捷了。
贴上代码:
public class GetDataFormNetWork {
final String Url = "http://vip.stock.finance.sina.com.cn/quotes_service/view/vMS_tradehistory.php";
List<StockInfo> mData = new ArrayList<StockInfo>();
int mPage;
public void get(final String date , final int page)
{
mPage = page;
new Thread(new Runnable() {
//开一个子线程来进行网络请求,用的是OKHttp
@Override
public void run() {
RequestBody body = new FormEncodingBuilder()
.add("symbol","sh601988")
.add("date",date)
.add("page",String.valueOf(page))
.build();
OkHttpClient mOkHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(Url)
.post(body)
.build();
try {
Response response = mOkHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
String data = new String(response.body().bytes(),"GBK");
Message msg = Message.obtain();
msg.obj = data;
handler.sendMessage(msg);
} else {
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public class StockInfo
{
String price;//成交价
String time;//成交时间
String increase;//涨跌幅
public StockInfo(String time, String price,String increase) {
this.price = price;
this.time = time;
this.increase = increase;
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String data = (String) msg.obj;
Document doc = Jsoup.parse(data);
Element table = doc.select("table.datatbl").first();//获取名称为datatb1的表格
Elements elements = table.getElementsByTag("tbody");
for (int i=0;i<elements.size();i++)//遍历容器
{
Element tr = elements.get(i);
Elements ths = tr.getElementsByTag("th");//获取th标签
Elements tds = tr.getElementsByTag("td");//获取td标签
for(int j=0;j<ths.size()/2;j++)
{
mData.add(new StockInfo(ths.get(2*j).text(),tds.get(5*j).text(),tds.get(5*j+1).text()));
}
}
mParse.onParse(mData,mPage);
}
};
private Parse mParse;
public interface Parse
{
abstract public void onParse(List<StockInfo> datas , int page);
}
public void setParse(Parse parse)
{
mParse = parse;
}
}
这样子,mData这个容器就存有这一页的表格数据了。注意的是,这里用到的是OkHttp进行网络请求,有兴趣的朋友可以到我的这篇博客来简单了解一下:http://blog.csdn.net/u014686721/article/details/52053304
当然了,这还只是Jsoup的简单实用,具体的其他使用还要去查看API文档。
——————————
总结:
1.自己遇到网络请求获取回来的html是有乱码的,那是因为编码的问题,可以用GBK编码方式。
2.Jsoup用select获取表格时,要在名字前面加上"table."
3.Element对象同过getElementByTag返回的时候Elements的容器。Element对象通过text方法可以去掉标签返回字符串。