46.使用Jsoup解析html获取数据

转载请注明出处 http://blog.youkuaiyun.com/qq_31715429/article/details/52264108
本文出自:猴菇先生的博客

对Jsoup研究不深,仅仅停留在解析数据的使用上,还是比较方便的,但是会有时候出现连接异常,可能是我的姿势不对。。还有,使用Jsoup应该是要异步解析,要不然会报错。
比如我想解析一个小说网站,就拿到它的网址

new ParseDirectoryAsync(this).execute(mBookInfo.getLink());

这里的mBookInfo你可以想象成是我请求接口完了json解析之后的BookInfo对象,里面有网址属性link,这是这本小说的章节列表网址
假如部分网址源码如下

<div id="list">
    <dl>    
        <dd><a href="2016820.html">第一章</a></dd>
        <dd><a href="2016821.html">第二章</a></dd>
        <dd><a href="2016822.html">第三章</a></dd>
    </dl>
</div>

那么在ParseDirectoryAsync中:

    /**
     * 解析章节目录和章节链接的异步
     */
    private class ParseDirectoryAsync extends AsyncTask<String, Integer, List<ReaderBean>> {

        private Context mContext;

        public ParseDirectoryAsync(Context context) {
            this.mContext = context;
        }

        @Override
        protected List<ReaderBean> doInBackground(String... params) {
            try {
                //Jsoup连接该网址,并设置超时时间
                Document doc = Jsoup.connect(params[0]).timeout(20000).get();
                //根据id获取某元素
                Element list = doc.getElementById("list");
                //获取某元素的标签集合
                Elements chapterLinks = list.getElementsByTag("a");
                List<ReaderBean> directories = new ArrayList<>();
                for (Element link : chapterLinks) {//遍历标签集合
                    ReaderBean chapter = new ReaderBean();
                    //获取该标签的属性值
                    String linkHref = link.attr("href");
                    String linkText = link.text().trim();
                    //封装好数据
                    chapter.setName(linkText);
                    chapter.setLink(params[0] + linkHref);
                    directories.add(chapter);
                }
                //返回给onPostExecute方法
                return directories;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(List<ReaderBean> directories) {
            super.onPostExecute(directories);
            if (directories != null && directories.size() > 0) {
                //这样就能获得每一章的链接地址,如果要获取每一章的小说内容,那么就继续使用Jsoup解析吧!
                LogUtil.e("章节链接 --> " + directories.get(0).getLink());
            } else {
                ToastUtil.show(ReaderActivity.this, "章节内容未找到");
            }
        }
    }

此外,Jsoup除了解析网络连接,还可以直接parse本地html代码,大家可以自行百度O(∩_∩)O~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值