Jsoup解析HTML+Debug使用

时间:2022-11-01 09:22:18

        前几天在论坛, 技术群里看见有人在讨论jsoup,开始不知道是个啥, 查看了下文档, 哦, 原来是解析HTML的个框架-架包吧;

jar包下载位置,使用说明文档等· :http://jsoup.org/download

        然后自己就开始写写看, 解析下看看能够成功; 遂有了下文;开始天真的以为直接在主线程中解析即可,但是蛋碎的是·······报错了;那就异步吧-两种实现方式,见代码;

        之前用过ntlm域验证的jar包,也是必须放置在异步任务里面匹配才能成功, 以后使用jar包,框架的时候要考虑到这一点;

       按照惯例, 上几张图先一睹为快~~~~~~   已解析成功

       先整一个傻瓜布局, 用来作为解析入口;

Jsoup解析HTML+Debug使用  Jsoup解析HTML+Debug使用 Jsoup解析HTML+Debug使用

不能插入多张图片? 不会吧?  还有好多示意图呢··、 呵呵  算啦,  文字描述也一样; 昨晚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(有点夸张哈)··· 尤其是在接口调试的时候, 相当的关键,地位相当明显!!  

        继续上图、 不知道是否能上传的了························  哎呦  还不错  还能继续上传、

Jsoup解析HTML+Debug使用

      好的 , 如上图所示, 在左侧先来个breakpoint, 先别急着让它跑完; 右击-watch一下doc的标签背后携带的具体数据信息, 右上角的信息是不是很靓呀??????

      其实没啥了, 这就是传说中的debug的熊样儿, 可爱吧、

      此时我们可以如下操作:

            1.  #+R, 调出命令行,键入notepad, 调出记事本;

            2.  将doc中的信息ctrl+A  而后ctrl+C复制到刚打开的记事本中,自己看看返回值的种种tag吧~~ 然后对应的进一步解析;

     其实做这一步的目的是要确保有信息返回, 如果此处都是空的, 那么就没有执行下去的理由,从这里向上找原因; 这就叫错误定位吧、 呵呵

     Jsoup解析HTML+Debug使用

     好, 那么我们来看上图, f6之后, 执行到links, 我们如果想偷懒的话,可以不看左上角, 直接将鼠标放到要查看的标签上面即可,Eclipse自动将信息弹出来,自己点击查看即可;

     我们不是来看热闹的哦, 俗话说··外行看热闹, 内行看门道的哈, 我们的目的是分析数据结构来提取我们想要的信息,

     看到红框内的标签了不? 呵呵  对  就是它了···Elements links = doc.select("a[href]");

     当提取到我们想要的信息的上一层时, 我们再继续查看当前标签下面的子标签····依次类推吧,若之前解析过XML、JSON的话, 这个是否似曾相识?

Jsoup解析HTML+Debug使用

     我们的debug屡试不爽哈、 其实这个成语用在此处不合适, 屡试不爽--多次尝试不出差错   咱就看它字面意思好了   记录博客也是记录心情嘛 、

     再看我们在傻瓜布局中最终要呈现的内容, 同样的招数, 称霸Eclipse界哈、  右上角--是真相;

     好啦, 就先写这么多吧, 其实最主要的是知道这个jar包是什么, 做什么用的, 怎么用-语法/使用环境等, 具体的代码实现就顺水推舟了;

     其实写这个博客, 主要是突然想到我当时不会、不懂用debug时候的囧相, 调试起来log一大堆, 无限被歧视,呵呵, 也算是自己成长的代价了,那就写出来好啦;异步任务当时也是不太懂, 现在写多了,成熟练工之后就不自然的理解跟明白了;还是要多想,多实现吧;

       还是我最欣赏的那句话·············

       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

       ~~~~~~~~~~~~~~~~~唯有压力才能突破, 才能距破茧成蝶之日更近一步~~~~~~~~~~~~~~~~~~     

       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~