转载请注明出处 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~