前几天在论坛, 技术群里看见有人在讨论jsoup,开始不知道是个啥, 查看了下文档, 哦, 原来是解析HTML的个框架-架包吧;
jar包下载位置,使用说明文档等· :http://jsoup.org/download
然后自己就开始写写看, 解析下看看能够成功; 遂有了下文;开始天真的以为直接在主线程中解析即可,但是蛋碎的是·······报错了;那就异步吧-两种实现方式,见代码;
之前用过ntlm域验证的jar包,也是必须放置在异步任务里面匹配才能成功, 以后使用jar包,框架的时候要考虑到这一点;
按照惯例, 上几张图先一睹为快~~~~~~ 已解析成功
先整一个傻瓜布局, 用来作为解析入口;
不能插入多张图片? 不会吧? 还有好多示意图呢··、 呵呵 算啦, 文字描述也一样; 昨晚3点多睡的觉, 今天一大早就醒了, 继续记录技术的点滴;
~~~~~~ 好啦 现在上代码~~~~~~
package com.receipes.quanjin;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class Jsoup4HTMLActivity extends Activity implements OnClickListener {
TextView showText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout rootLayout = new LinearLayout(this);
rootLayout.setOrientation(LinearLayout.VERTICAL);
Button jsoupBtn = new Button(this);
jsoupBtn.setId(2001);
jsoupBtn.setText("点击开始解析HTML--");
showText = new TextView(this);
rootLayout.addView(jsoupBtn);
rootLayout.addView(showText);
setContentView(rootLayout);
jsoupBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == 2001) {
handleJsoupParse();
}
}
String myString = "";
private void handleJsoupParse() {
//new Thread(jsoupRunnable).start();
new AsyncTask<Void, Void, Void>() {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(Jsoup4HTMLActivity.this);
dialog.setCancelable(true);
dialog.setIndeterminate(false); //设置进度条是否为不明确
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //圆形
dialog = ProgressDialog.show(Jsoup4HTMLActivity.this, "", "正在获取jsoup数据...", true); //模态
};
@Override
protected Void doInBackground(Void... params) {
StringBuilder sb = new StringBuilder();
try {
Document doc = Jsoup.connect("http://www.baidu.com").get();
Elements links = doc.select("a[href]");
for(Element link : links) {
sb.append(link.attr("abs:href")).append(" ").append(link.text()).append(" ");
}
myString = sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(dialog.isShowing()) {
dialog.dismiss();
}
showText.setText(myString);
}
}.execute();
showText.setText(myString);
}
private Runnable jsoupRunnable = new Runnable() {
@Override
public void run() {
StringBuilder sb = new StringBuilder();
try {
Document doc = Jsoup.connect("http://www.baidu.com").get();
Elements links = doc.select("a[href]");
for(Element link : links) {
sb.append(link.attr("abs:href")).append(" ").append(link.text()).append(" ");
}
myString = sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
实现很简单, 一个异步任务完成下载, 没了
其实主要的是【数据分析】---看你请求过去返回的数据类型, 看其中的数据标签是什么,怎么看? 当然是Eclipse经典--debug啦!!! 有人说了, 我不会debug, 你没用过怎么知道自己不会?
断点--F6-watch; 搞定, 你没用过你就说自己不会debug? 呵呵 言辞有点过激、 继续 不知道还能不能上传示意图片了 蛋碎、
主要用到些编程习惯:
1.平时要尝试着用Java代码垒布局,静态拉几个xml页面谁不会······ 我们是全能型的Android开发者哈, 代码也要会垒~ 以后在【动态生成布局】的时候你就知道这个的重要性了, 单纯的xml是不能满足我们的需求的哈~~~
2.学会用异步任务, 而且要很熟练, 各种形式; 其实new Thread() { run() {} }.start();其实也行, 反正看个人习惯吧, runnable+handler也可以--我主要用这个来刷新UI展示动画渐变;
3.千万~~~千万~~~千万~~~千万~~~千万~~~要会用debug, 不想用的大哥大姐们, 我拜托你们了, 真的很爽的啊、
debug+命令行notepad-记事本 >= Log(有点夸张哈)··· 尤其是在接口调试的时候, 相当的关键,地位相当明显!!
继续上图、 不知道是否能上传的了························ 哎呦 还不错 还能继续上传、
好的 , 如上图所示, 在左侧先来个breakpoint, 先别急着让它跑完; 右击-watch一下doc的标签背后携带的具体数据信息, 右上角的信息是不是很靓呀??????
其实没啥了, 这就是传说中的debug的熊样儿, 可爱吧、
此时我们可以如下操作:
1. #+R, 调出命令行,键入notepad, 调出记事本;
2. 将doc中的信息ctrl+A 而后ctrl+C复制到刚打开的记事本中,自己看看返回值的种种tag吧~~ 然后对应的进一步解析;
其实做这一步的目的是要确保有信息返回, 如果此处都是空的, 那么就没有执行下去的理由,从这里向上找原因; 这就叫错误定位吧、 呵呵
好, 那么我们来看上图, f6之后, 执行到links, 我们如果想偷懒的话,可以不看左上角, 直接将鼠标放到要查看的标签上面即可,Eclipse自动将信息弹出来,自己点击查看即可;
我们不是来看热闹的哦, 俗话说··外行看热闹, 内行看门道的哈, 我们的目的是分析数据结构来提取我们想要的信息,
看到红框内的标签了不? 呵呵 对 就是它了···Elements links = doc.select("a[href]");
当提取到我们想要的信息的上一层时, 我们再继续查看当前标签下面的子标签····依次类推吧,若之前解析过XML、JSON的话, 这个是否似曾相识?
我们的debug屡试不爽哈、 其实这个成语用在此处不合适, 屡试不爽--多次尝试不出差错 咱就看它字面意思好了 记录博客也是记录心情嘛 、
再看我们在傻瓜布局中最终要呈现的内容, 同样的招数, 称霸Eclipse界哈、 右上角--是真相;
好啦, 就先写这么多吧, 其实最主要的是知道这个jar包是什么, 做什么用的, 怎么用-语法/使用环境等, 具体的代码实现就顺水推舟了;
其实写这个博客, 主要是突然想到我当时不会、不懂用debug时候的囧相, 调试起来log一大堆, 无限被歧视,呵呵, 也算是自己成长的代价了,那就写出来好啦;异步任务当时也是不太懂, 现在写多了,成熟练工之后就不自然的理解跟明白了;还是要多想,多实现吧;
还是我最欣赏的那句话·············
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~唯有压力才能突破, 才能距破茧成蝶之日更近一步~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~