1. 程式人生 > >通過html解析網頁資料

通過html解析網頁資料

最近遇到一個工作需要從新浪財經網頁拉取某支股票的當天成交明細,於是乎發現了一個好用的第三方包,在這裡跟大家分享一下。

這個包叫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方法可以去掉標籤返回字串。