您的位置:首页 > Web前端 > JavaScript

Jsoup解析HTML+Debug使用

2013-08-31 08:59 369 查看
前几天在论坛, 技术群里看见有人在讨论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一大堆, 无限被歧视,呵呵, 也算是自己成长的代价了,那就写出来好啦;异步任务当时也是不太懂, 现在写多了,成熟练工之后就不自然的理解跟明白了;还是要多想,多实现吧;

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

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: